2010-04-27 13 views
6

Estoy tratando de leer un archivo delimitado por la devolución. lleno de frasescómo leer una cadena de un archivo n delimitado

Estoy tratando de poner cada frase en una cadena.

El problema es que cuando intento leer el archivo con

fscanf(file,"%50s\n",string); 

la cadena sólo contiene una palabra. cuando se topa con un espacio, deja de leer la cadena

Respuesta

2

fscanf se puede modificar para leer los espacios anteriores. Los detalles son un poco complicados. Esto es lo que dice la página del manual sobre% [...]

detecta una secuencia no vacía de caracteres del conjunto especificado de caracteres aceptados; el siguiente puntero debe ser un puntero a char, y allí debe haber suficiente espacio para todos los caracteres en la cadena, más un carácter NUL de terminación . El omisión habitual de de espacio en blanco inicial es suprimido. La cadena se debe hacer de caracteres en (o no en) un conjunto particular de ; el conjunto está definido por los caracteres entre el carácter de corchete abierto [y un carácter de cierre ]. El conjunto excluye esos caracteres si el primer carácter después del corchete abierto es circunflejo ^. Para incluir un corchete en el conjunto, conviértalo en el primer carácter después del corchete abierto o en circunflejo; cualquier otra posición terminará el conjunto. El carácter guión - también es especial; cuando se coloca entre otros dos caracteres, agrega todos los caracteres intermedios a el conjunto. Para incluir un guión, hágalo el último carácter antes del último cierre de paréntesis. Por ejemplo, `[^] 0-9-] 'significa el conjunto` `todo excepto cerrar corchete, cero a nueve y guión' '.La secuencia termina con la apariencia de un carácter no en el conjunto (o, con un circunflejo, in) o cuando el ancho del campo se agota.

Por lo tanto,% [^ \ n] debe leer todo hasta el retorno de carro.

+2

Lee todo hasta la nueva línea, pero * no * la nueva línea en sí. Si realiza un bucle en 'fscanf (file,"% [^ \ n] ")', seguirá obteniendo la cadena vacía una y otra vez. Necesita consumir la línea nueva con un espacio en blanco en la cadena de formato, o algo así como '% * c'. –

+0

Gracias, esto es todo. –

+0

@Adam Buenos puntos. La respuesta aceptada anteriormente también es más segura para errores de desbordamiento de búfer. –

3

fscanf con %s deja de leer cuando encuentra espacios en blanco.

Puesto que usted está leyendo el texto sin formato, sólo tiene que utilizar fgets, que lee hasta que se llene la memoria intermedia se le dé, se encuentra una nueva línea (\n), o se alcanza el final del archivo-, lo que ocurra primero.

+0

Esto funciona de forma extraña. no lee todas las líneas y cada cadena en lugar de terminar en \ 0 termina en \ n –

+1

. Cada cadena todavía termina en ''\ 0'', pero el último carácter anterior es' '\ n'', ya que se lee exactamente en la línea aparece en el archivo. Si el ''\ n'' está ausente, significa que tu buffer no era lo suficientemente grande para toda la línea, o que simplemente leíste los últimos caracteres del archivo y no terminó con una nueva línea. – caf

5
fscanf(file,"%50[^\n]\n",string); 
  1. Cada carácter excepto \n será consumido por [^\n]

  2. máximo 0f 50 caracteres será consumido (asegúrese de que la cadena tiene espacio para 51 al menos)

  3. ..\n",string esto asegura que \n también se consume de modo que la ne La llamada a xxt no solo devuelve una cadena nula.

+0

esto funciona muy bien, gracias –

2

Avoid using scanf. Como ya se mencionó, debe usar fgets en su lugar.

Si no desea utilizar un búfer de tamaño fijo y para permitir líneas de longitud arbitraria, puede intentar usar Chuck Falconer's public domain ggets function. (Ese vínculo parece estar abajo en este momento, pero archive.org has a copy.)

+0

@Zenikoder: Vaya, ¿se tomó la molestia de rechazar algunos de los mensajes que mencionan 'ggets'? De todos modos, independientemente de lo que pienses de la cordura de CBFalconer, debes juzgar el código, no el autor. Si tiene quejas específicas contra la implementación de 'ggets', es justo, pero no creo que sea justo rechazarlo solo porque no le gusta el tipo. – jamesdlin

-1

enviar datos utilizando inicialmente Payload_ID 00 01 02 03 .... 10

uso

char * PChar = ""; // para la captura de cadenas.

fprintf (fp1, "% s", strtok (pChar, "Payload_ID"));

+0

aquí Payload_ID es el delimitador que puede especificar –

Cuestiones relacionadas