• Viernes 8 de Noviembre de 2024, 20:19

Autor Tema:  getline de un ifstream no lee correctamente  (Leído 1550 veces)

pascualol

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
getline de un ifstream no lee correctamente
« en: Lunes 18 de Mayo de 2009, 13:50 »
0
Buenas, soy nuevo en el foro.
Tras mucho buscar por inernet sin encontrar una solucion, me anime a escribir aqui, aver si alguien pudiera echarme un cable con un problema que me trae de cabeza.

El caso es que tengo que hacer un programa que debe leer una serie de datos de un txt y procesarlos, pero en la lectura de los datos, por algun motivo que no alcanzo a ver, no hace lo que deberia: o bien lee siempre la primera palabra (o lee la primera y no lee las demas, no estoy seguro), o bien le basura a parte de lo que debe leer (auque tambien puede ser que no cierre bien la cadena de caracteres y al imprimir impima los caracteres no validos), o directamente no lee nada (es decir, deja la cadena en blanco).

He cambiado mucho el código desde el primer fallo, probando tanto >> como getline() (con todas las popsibles combinaciones de sus argumentos) y get().
El codigo en el main es este:

Código: C++
  1.  
  2. int main(int argc, char** argv)
  3. {
  4.         //...
  5.         conjunto conjuntoinf;
  6.     ifstream fi;
  7.     ofstream fo; // esto es para guardar los datos procesados
  8.        //...
  9.         AbrirFicheros(fi, fo, argv[1], argv[4]);
  10.     LeerInformacion1 (conjuntoinf, fi);
  11.        //...
  12.        fi.close();
  13.        fo.close();
  14.  
  15.  

conjunto es una clase propia, para almacenar la informacion. Asi abro los ficheros, creo que está bien, pues no tiene mucha ciencia:

Código: C++
  1.  
  2. void AbrirFicheros(ifstream & fi, ofstream & fo, char * entrada, char * salida){
  3.     fi.open (entrada, ios::in);
  4.     if (!fi) {
  5.        cerr << "Error: no puedo abrir el fichero de datos." << endl;
  6.        exit (1);
  7.     }
  8.    
  9.     fo.open (salida, ios::app);
  10.     if (!fo) {
  11.        cerr << "Error: no puedo crear el fichero de resultados." << endl;
  12.        exit (1);
  13.     }
  14. }
  15.  
  16.  

Y asi proceso el texto. No compruebo el final de texto (EOF), pues esta solo es la primera de unas cuantas lecturas de datos consecutivos en el fichero, es decir, el txt es mucho mas extenso de lo que yo lleog a leer aqui.

Código: C++
  1.  
  2. void LeerInformacion (conjunto & aux, istream & fi){
  3.     Informacion inftemp; // informacion es la clase "basica" de la que esta compuesta la clase "conjunto"
  4.     int numeinfs, n;
  5.         char cad[100];
  6.    
  7.     fi >> numeroinfs;
  8.     for (int i = 0; i < numeroinfs; i++){
  9.        
  10.         fi.getline(cad, 50, 'n'); // el nombre del bloque de informacion (pueden ser varias palabras)
  11.         inftemp.cambiarnombre(cad);
  12.  
  13.         fi.getline(cad, 100, 'n'); // titulo de la informacion (pueden ser varias palabras)
  14.         inftemp.cambiarpregunta(cad);
  15.        
  16.         fi >> n; // numero de componentes de la informacion (cada componente es una unica palabra)
  17.         cout << nombre << pregunta << n;
  18.         for (int j = 0; j < n; j++){
  19.             fi.getline(cad,  50, 'n');
  20.             inftemp.aniadircomponente(cad, false); // el false es para otra movida, aqui no importa
  21.         }
  22.         aux.add(inftemp);
  23.                 inftemp.borrar (); // reiniciamos el bloque para leer el siguiente y añadirlo a aux
  24.     }
  25.    
  26.     if (aux.numerodeBloques() != numeroinfs) {
  27.         cerr << "Informacion no leida correctamente";
  28.         exit(1);
  29.     }
  30. }
  31.  
  32.  

Bueno, este es el bloque que da error; miento, no da error, solo no hace lo que debe. Esta es la version con los getline, pero probe otras muchas. Tambien añadir que las operaciones con las clases propias no influyen, pues tambien probe a solo leerlo y mostrarlo con cout y pasaba lo mismo. Con getline, lee basura o no lee, y con get y >> lee una vez y no mas. Por ultimo, probe a no usar siempre cad, usando una variable diferente en cada caso, pero igualmente no leia lo que debia. La estructura del fichero (por lo menos en cuanto a esta parte concierne) es la siguiente:

     Nº DE BLOQUES    
     NOMBREBLOQUE1
     TITULOBLOQUE1
     Nº DE COMPONENTES
     COMPONENTE1
     COMPONENTE2
     ...

     NOMBREBLOQUE2
     TITULOBLOQUE2
     ...
     ...

Se que el error no esta en el fichero. SI alguien pudiera ayurdarme, le estaria muy agradecido.
Que tengan un buen dia.

pascualol

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: getline de un ifstream no lee correctamente
« Respuesta #1 en: Viernes 22 de Mayo de 2009, 18:26 »
0
Bueno, problema resuelto, aunque nadie respondiera... &lt;_&lt; sucede que si leo con >> solo lee has el siguiente espacio o salto de linea, pero NO lo elimina. Es decir, que si acontinuacion leo con getline, estoy leyendo 'n', por ejemplo.