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:
int main(int argc, char** argv)
{
//...
conjunto conjuntoinf;
ifstream fi;
ofstream fo; // esto es para guardar los datos procesados
//...
AbrirFicheros(fi, fo, argv[1], argv[4]);
LeerInformacion1 (conjuntoinf, fi);
//...
fi.close();
fo.close();
conjunto es una clase propia, para almacenar la informacion. Asi abro los ficheros, creo que está bien, pues no tiene mucha ciencia:
void AbrirFicheros(ifstream & fi, ofstream & fo, char * entrada, char * salida){
fi.open (entrada, ios::in);
if (!fi) {
cerr << "Error: no puedo abrir el fichero de datos." << endl;
exit (1);
}
fo.open (salida, ios::app);
if (!fo) {
cerr << "Error: no puedo crear el fichero de resultados." << endl;
exit (1);
}
}
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.
void LeerInformacion (conjunto & aux, istream & fi){
Informacion inftemp; // informacion es la clase "basica" de la que esta compuesta la clase "conjunto"
int numeinfs, n;
char cad[100];
fi >> numeroinfs;
for (int i = 0; i < numeroinfs; i++){
fi.getline(cad, 50, 'n'); // el nombre del bloque de informacion (pueden ser varias palabras)
inftemp.cambiarnombre(cad);
fi.getline(cad, 100, 'n'); // titulo de la informacion (pueden ser varias palabras)
inftemp.cambiarpregunta(cad);
fi >> n; // numero de componentes de la informacion (cada componente es una unica palabra)
cout << nombre << pregunta << n;
for (int j = 0; j < n; j++){
fi.getline(cad, 50, 'n');
inftemp.aniadircomponente(cad, false); // el false es para otra movida, aqui no importa
}
aux.add(inftemp);
inftemp.borrar (); // reiniciamos el bloque para leer el siguiente y añadirlo a aux
}
if (aux.numerodeBloques() != numeroinfs) {
cerr << "Informacion no leida correctamente";
exit(1);
}
}
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.