Hacer que fscanf ignore el parámetro opcional
Pregunta
Estoy usando fscanf para leer un archivo que tiene líneas como
Número <-espacio en blanco-> cadena <-espacio en blanco-> opcional_3ra_columna
Deseo extraer el número y la cadena de cada columna, pero ignoro la tercera columna si existe
Datos de ejemplo:
12 fo algo
03 barra
24 algo #comentario aleatorio
Me gustaría extraer 12,foo;03,barra;24, algo mientras se ignora "algo" y "#comentario aleatorio"
Actualmente tengo algo como
while(scanf("%d %s %*s",&num,&word)>=2)
{
assign stuff
}
Sin embargo, esto no funciona con líneas sin una tercera columna.¿Cómo puedo hacer que ignore todo después de la segunda cadena?
Solución
Me parece que la solución más simple es scanf ("% d% s " ;, & amp; num, & amp; word) y luego fgets () comer el resto de la línea.
Otros consejos
El problema es que el %*s
está comiendo el número en la siguiente línea cuando no hay una tercera columna, y luego la siguiente %d
está fallando porque el siguiente token no es un número.Para arreglarlo sin usar gets()
seguido por sscanf()
, puedes usar la clase de carácter especificada:
while(scanf("%d %s%*[^\n]", &num, &word) == 2)
{
assign stuff
}
El [^\n]
dice que coincida con tantos caracteres como sea posible que no sean nuevas líneas, y el *
suprime la asignación como antes.También tenga en cuenta que no puede poner un espacio entre el %s
y el %*[\n]
, porque de lo contrario ese espacio en la cadena de formato coincidiría con la nueva línea, provocando que %*[\n]
para que coincida con toda la línea siguiente, que no es lo que desea.
Use fgets () para leer una línea a la vez y luego use sscanf () para buscar las dos columnas que le interesan, más robustas y no tiene que hacer nada especial para ignorar los datos finales.
A menudo uso gets () seguido de un sscanf () en la cadena que simplemente, er, tienes.
Bonificación: puede separar la prueba de fin de entrada del análisis.