quiero saber cual es la diferencia entre fgets()
y scanf()
. Estoy usando C como mi plataforma.
Diferencia entre scanf() y fgets()
Biswajyoti Das
Hay múltiples diferencias. Dos cruciales son:
fgets()
puede leer desde cualquier archivo abierto, peroscanf()
solo lee la entrada estándar.fgets()
lee ‘una línea de texto’ de un archivo;scanf()
se puede usar para eso, pero también maneja conversiones de cadena a tipos numéricos incorporados.
Mucha gente usará fgets()
para leer una línea de datos y luego usar sscanf()
para diseccionarlo.
Daniel
int scanf(const char * restrict format, ...);
escanear(3) busca cierta patrón definido por el argumento de formato en la entrada dada conocida como Entrada estándar, donde usted define el patrón. La entrada dada a escanear(3)dependiendo de su variante (scanf, fscanf, sscanf, vscanf, vsscanf, vfscanf), puede ser una cadena o un archivo.
char *fgets(char * restrict str, int size, FILE * restrict stream);
fgets(3) solo lee un línea del archivo de entrada Arroyo y copie los bytes como una cadena de terminación nula en el búfer calle y limitar la salida al búfer a bytes dados en Talla.
petirrojos kelly
Scanf no realiza comprobaciones de límites. Es probable que fgets sea la mejor opción. Luego puede usar sscanf() para evaluarlo.
Buena discusión sobre el tema aquí-
http://cboard.cprogramming.com/c-programming/109243-scanf-vs-fgets.html
¿Cómo permite que se ingresen espacios usando scanf? (Ese fue mi gemelo malvado que recibió una reprimenda por olvidar esto, no yo)
-
Para tipos numéricos, scanf() no necesita hacer una verificación de límites. Para los tipos de cadena, puede decirle a scanf() que realice una verificación de límites.
–Jonathan Leffler
9 de agosto de 2009 a las 21:45
joel reyes
se debe notar que scanf
las especificaciones del patrón permiten límites de ancho de campo:
scanf( " %80s", mybuffer );
Pero donde printf()
permite pasar el ancho como una variable (con ‘*’):
printf( "My name is %*s.\n", 20, name );
scanf()
no. (Interpreta el ‘*’ como una bandera para suprimir/ignorar el campo por completo). Lo que significa que terminas haciendo cosas como esta:
#define NAMEWIDTH 40
char buffer[ NAMEWIDTH + 4 ];
...
scanf( " %40x", buffer );
y no hay forma de conectar el ancho de campo 40 en el scanf()
con el ancho de búfer 40 en la declaración del búfer.
scanf analiza una cadena que lee (o crea) y fgets lee una línea de un ARCHIVO* abierto. ¿O te refieres a fscanf?
La principal diferencia radica en el hecho de que scanf
no tiene límites en la cantidad de caracteres que se pueden leer (en su uso predeterminado), mientras que fgets
tiene un número máximo de caracteres que se pueden leer.
Ver el prototipo de las dos funciones:
char * fgets (char * dest, int size, FILE * stream);
int scanf (const char * formato, …);
Puede ver que el segundo parámetro de fgets
impone leer como máximo tamaño char.
Otra clara diferencia es el valor de retorno: fgets
devolver un puntero a dest
en el éxito; scanf
devolver el número de elementos de entrada emparejados y asignados con éxito. Entonces el escanear la función escanea la entrada de acuerdo con formatoy lee la entrada del flujo de entrada estándar Entrada estándartiempo fgets
lee la entrada de ARCHIVO * transmisión por defecto.
En conclusión, podrías usar scanf
leer datos de un ARCHIVO e insertarlos en una matriz de tamaño fijo (por ejemplo) no tiene mucho sentido. una ventaja de scanf
es el formato de los datos de salida: si la función lee 12345\n
la salida es 12345
mientras fgets lee y regresa hasta \n
(incluido), agregando un \0
al final como un terminador de cadena.