| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
casidus
Registrado: 14 Feb 2014 Mensajes: 2
| Publicado: 14/02/2014 2:29 am | | | Título: Consulta fscanf leer nueva linea |
| Buenos dias.
me gustaria saber si me podeis decir como hacer esto.
tengo que hacer un programa que me lee de un fichero txt una matrices de longitud variable, por ejemplo:
1 2 1 1 1 1 1
en esta matrices no hay 0 sino que se sustituyen por un salto de linea si estan al final o por un espacio si estan en medio.
yo hasta ahora lo que hacia era lo siguiente;
fscanf(files [a], "%[^\n]s", temp)
temp como su nombre dice en una variable temporal del tipo char [] lo suficientemente grande para que coja una linea.
la primera linea me la lee perfectamente, pero ahi se queda solo me lee la primera.
que hay que hacer para que me lea todas las lineas una por una ???
se que lo correcto seria hacer fscanf(files [a], "%d %d %d", temp) pero como es variable la longitud, y los ceros son o espacios o saltos de linea no me funciona bien
gracias por todo |
| | Volver arriba | |  | rir3760

Registrado: 01 Oct 2004 Mensajes: 7517 Ubicación: Mexico
| Publicado: 14/02/2014 5:51 am | | | Título: |
| Para empezar debes utilizar "%[SET]" sin la 's' al final y donde 'SET' es el conjunto de caracteres permitidos.
El problema en tu caso se debe a que lees la linea pero el avance de linea se queda en el bufer de la entrada estándar. Cuando tratas de leer la segunda linea con "%[^\n]" la función se encuentra con ese carácter y termina sin almacenar uno solo en el array.
La solución es utilizar "%[^\n]%*c" donde "%[^\n]" lee los caracteres distintos a '\n' y "%*c" descarta este ultimo. Para explicarlo mejor un ejemplo sencillo que lee todas las lineas del archivo y las imprime:
| Código: | #include <stdio.h> #include <stdlib.h>
#define NOM_ENTRADA "Entrada.txt"
int main(void) { FILE *in; char linea[4096]; if ((in = fopen(NOM_ENTRADA, "r")) == NULL){ perror(NOM_ENTRADA); return EXIT_FAILURE; } while (fscanf(in, "%[^\n]%*c", linea) == 1) puts(linea); fclose(in); return EXIT_SUCCESS; } |
Un saludo _________________ C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language |
| | Volver arriba | |  | casidus
Registrado: 14 Feb 2014 Mensajes: 2
| Publicado: 14/02/2014 6:00 am | | | Título: |
| ok, gracias, ya lo he conseguido.
ahora una ultima consulta, tengo que leer dos archivos, como puedo hacerlo a traves de threatscon pipe???
para crear dos y que cada uno lo lea de forma simultanea.
gracias por todo |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |