Título: Problema con manejo de archivos en C++ Publicado por: placa4 en 12 Marzo 2013, 07:39 am Hola, resulta que estaba creando un programa que lea de un archivo de texto con el siguiente formato:
Código: <pregunta> esta es la pregunta </pregunta> <respuesta> esta es la respuesta a la pregunta </respuesta> Así pudiera guardar la pregunta en una cadena, y luego la respuesta en otra. De esta manera el programa iría haciendo las preguntas aleatoriamente y luego mostrando las respuestas, pero tengo un problema. La clase ifstream no la sé usar y siempre me trata una entrada más de la que quiero, lo que me hace tener que usar de forma rara el número de preguntas (restándole uno porque si no usa una entrada vacía de los arrays), ¿alguien me puede decir a qué se debe? Pongo el code completo: main.cpp Código pregunta.h Código pregunta.cpp Código
El problema está en el constructor de la clase Pregunta, donde se inicializa el array con preguntas y respuestas. Antes hice una traza de la variable nPreguntas y siempre coge una más de la que debe, lo que me cabrea bastante y es la razón por la que pregunto esto. Es decir, si el texto tiene 2 preguntas, nPreguntas vale 3,y así, en comenzar() fijaros que tengo que hacer módulo de nPreguntas-1 y no de nPreguntas, para que funcione correctamente. Muchas gracias de antemano y un saludo. Título: Re: Problema con manejo de archivos en C++ Publicado por: amchacon en 12 Marzo 2013, 15:57 pm Oh, es un pequeño fallo de concepto que tiene iostream.
Veras, la bandera eof se activa cuando se accede fuera del archivo. Si tu tienes 4 preguntas, leera las 4 preguntas y hará otra vuelta más porque aún no has sobrepasado el final de archivo Hay dos soluciones: - La chapucera, consiste en disminuir en 1 el numero de preguntas. - Obtener el tamaño del archivo.txt y leer dicha cantidad de bytes. La segunda se podría implementar de la siguiente forma: Código
El if es opcional, solo sería para que los archivos pequeños cargasen más rápido. Se podría dejar solo con el else. Por cierto si usas la clase string combinada con la clase vector, podrás leer cualquier numero de preguntas con cualquier numero de letras: Código
Código
Para más información sobre las clases string y vector: http://www.cplusplus.com/reference/string/string/ http://www.cplusplus.com/reference/vector/vector/ Título: Re: Problema con manejo de archivos en C++ Publicado por: rir3760 en 12 Marzo 2013, 16:33 pm Ya que piensa usar etiquetas en lugar de lineas para separar las preguntas y respuestas me parece mas sencillo utilizar solo un objeto de la clase string para almacenar todo el contenido del archivo. Mas o menos así:
Código
Y para encontrar las etiquetas de apertura y cierre puede utilizar la función miembro std::string::find (http://www.cplusplus.com/reference/string/string/find/). Un saludo Título: Re: Problema con manejo de archivos en C++ Publicado por: placa4 en 13 Marzo 2013, 07:08 am Aaah bonitas ideas amchacon. Claro usando vector es cierto podría hacerlo sin límite de antemano, no lo había pensado.
Y muchas gracias por aclarármelo ^_^, claro vigilando a mano el tamaño de los bytes es algo análogo a si eof (si es que funcionara como a mí me gustaría ¬¬) devolviera true al llegar al final del archivo y no al sobrepasarlo, perfecto =) Y en cuanto a rir3760 muchas gracias, es también una buena idea, pero no uso etiquetas por capricho, verás yo lo hice con la idea de que las preguntas y respuestas pudieran tener por dentro saltos de línea, párrafos etc. no fueran simples preguntas de un renglón, solo fue por eso, pero muchas gracias =) Un saludo a los dos. |