uso de fscanf en C

Tengo un archivo como este:

10 15
something

Quiero leer esto en variables de árbol, digamos número1, número2 y micadena. Tengo dudas sobre que tipo de patrón darle a fscanf. Estoy pensando algo como esto;

fscanf(fp,"%i %i\n%s",number1,number2,mystring);

¿Debería funcionar esto, y también, es esta la forma correcta de leer este archivo? Si no, ¿qué sugeriría?

preguntado el 09 de marzo de 12 a las 17:03

3 Respuestas

fscanf(fp,"%i %i\n%s",&number1,&number2,mystring);

fscanf toma punteros.

respondido 09 mar '12, 17:03

Lea cada línea con fgets (o getline si lo tiene), divida la línea con strsep (mejor, si está disponible) o strtok_r (API más incómoda pero más portátil), y luego use strtoul para convertir cadenas en números según sea necesario.

*scanf nunca debe usarse, porque:

  1. Algunas cadenas de formato (por ejemplo, un simple "%s") están tan ansiosos por desbordar sus búferes como gets .
  2. El comportamiento en el desbordamiento de enteros es indefinido -- la entrada inválida puede bloquear potencialmente su programa.
  3. No informan la posición del carácter del primer error de escaneo, lo que hace que sea casi imposible recuperarse de un error de análisis. (Esto se puede mitigar un poco usando fgets y entonces sscanf en lugar de fscanf.)

respondido 11 mar '12, 16:03

¿Cuál es el daño de usar scanf? - vive

Además del problema con los punteros, generalmente usar espacios en el formato scanf es un error; en la mayoría de los casos, scanf salta los espacios en blanco automáticamente. Así que usaría algo como:

int number1, number2;
char mystring[32];
fscanf("%i%i%31s", &number1, &number2, &mystring)

Esto leerá dos números seguidos de una cadena de hasta 31 caracteres que no sean espacios en blanco, todos separados por cualquier espacio en blanco. Tenga en cuenta que los "espacios en blanco" incluyen espacios, tabulaciones y saltos de línea, por lo que no importa si todo está en una sola línea, o si se distribuye en 3 líneas o algo intermedio.

Tenga en cuenta también el uso de un límite en el tamaño de la cadena; sin eso, la entrada podría desbordar cualquier búfer de tamaño fijo que proporcione (y no hay forma de proporcionar un búfer de tamaño variable con scanf)

respondido 09 mar '12, 17:03

El & in mystring es un error: mystring por sí mismo "decae" a un valor de tipo char* (justo lo fscanf quiere); &mystring es un valor de tipo char (*)[32]. - pmg

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.