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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top