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
#include <iostream> #include <fstream> #include "pregunta.h" using namespace std; int main() { Pregunta p; p.comenzar(); return 0; }
Código
pregunta.cpp
#include <iostream> #include <fstream> #define MAX_LETRAS 5000 #define MAX_PREGUNTAS 200 class Pregunta{ private: char pregunta[MAX_PREGUNTAS][MAX_LETRAS]; char respuesta[MAX_PREGUNTAS][MAX_LETRAS]; int nPreguntas; public: Pregunta(); void comenzar(); void auxMuestra(); };
Código
#include "pregunta.h" #include <stdlib.h> //Pseudorandomizado y limpiar la pantalla #include <time.h> //Para la semilla de randomizacion using namespace std; //Constructor Pregunta::Pregunta(){ char aux[MAX_LETRAS]; nPreguntas = 0; ifstream archivo; archivo.open("preguntas.txt",ifstream::in); while(!archivo.eof()){ //PREGUNTA //Comida de etiqueta <pregunta> archivo.getline(aux, MAX_LETRAS, '>'); //Adquirir el texto de la pregunta archivo.getline(pregunta[nPreguntas], MAX_LETRAS, '<'); //Comida de etiqueta </pregunta> archivo.getline(aux, MAX_LETRAS, '>'); //RESPUESTA //Comida de etiqueta <respuesta> archivo.getline(aux, MAX_LETRAS, '>'); //Adquirir el texto de la respuesta archivo.getline(respuesta[nPreguntas], MAX_LETRAS, '<'); //Comida de etiqueta </respuesta> archivo.getline(aux, MAX_LETRAS, '>'); nPreguntas++; } archivo.close(); } void Pregunta::comenzar(){ srand (time(NULL)); while(true){ int aleatorio = rand() % (nPreguntas-1); cout << "PREGUNTA: " << endl; cout << pregunta[aleatorio]; cout << endl; cin.get(); cout << "RESPUESTA: " << endl; cout << respuesta[aleatorio]; cin.get(); system("cls"); } } void Pregunta::auxMuestra(){ for(int i=0; i < nPreguntas; i++){ cout << "PREGUNTA" << endl << pregunta[i]; cout << endl << "RESPUESTA" << endl << respuesta[i] << endl; } }
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.