2010-01-04 12 views
13

Sé que todo el mundo me ha dicho que use fgets y no recibe debido al desbordamiento del búfer. Sin embargo, estoy un poco confundido sobre el tercer parámetro en fgets(). Como yo lo entiendo, fgets depende de:función de los fgets() en C

char * fgets (char * str, int num, FILE * stream); 

char* str es el PTR a la que se almacenará mi entrada.

num es el número máximo de caracteres para ser leído.

pero lo que es FILE *stream? Si solo estoy pidiendo al usuario que ingrese una cadena (como una oración) ¿debería simplemente escribir "stdin"?

Y debería escribir FILE *stdin en la parte superior, cerca main()?

Respuesta

14

Estás en la correcta. stream es un puntero a una estructura FILE, como la que se devuelve desde fopen. stdin, stdout y stderr ya están definidos para su programa, por lo que puede usarlos directamente en lugar de abrirlos o declararlos por su cuenta.

Por ejemplo, se puede leer de la entrada estándar con:

fgets(buffer, 10, stdin); 

o de un archivo específico con:

FILE *f = fopen("filename.txt", "r"); 
fgets(buffer, 10, f); 
+1

creo que el segundo parámetro debe ser strlen (tampón) -1. A menos que el buffer sea de 11 bytes. – ant2009

+0

@robUK, eso solo funcionaría si el buffer no fuera todo ceros para empezar. Como se mencionó en el PO, los desbordamientos del búfer no son realmente la preocupación de la pregunta. –

1

archivo es el archivo C estándar. Sí, si desea leer desde la entrada estándar, stdin es el símbolo correcto.

1

Sí, sólo debe utilizar stdin. Eso es un FILE * predefinido que se lee desde la entrada estándar de su programa. Y ya debería estar definido si tiene un #include <stdio.h> en la parte superior de su archivo (que necesitará para fgets).

1

En general, hay dos formas de comunicarse con los archivos en C. Uno está utilizando el sistema operativo de bajo nivel llama depende del sistema tales como open(), read(), write() etc, que trabajan con los descriptores de fichero. Otro está utilizando FILE estructuras que se utilizan en funciones de la biblioteca C como fread(), etc fwrite() incluyendo el que usted ha mencionado anteriormente.

Como sucede con la filosofía de UNIX, todo es un archivo. Por lo tanto, incluso la entrada estándar (stdin) se trata como un puntero a una estructura FILE.

tl; dr Sí, usted debe utilizar para stdinFILE* stream en su llamada a fgets()

Cuestiones relacionadas