Hola, resulta que estaba creando un programa que lea de un archivo de texto con el siguiente formato:
<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
#include <iostream>
#include <fstream>
#include "pregunta.h"
using namespace std;
int main()
{
Pregunta p;
p.comenzar();
return 0;
}
pregunta.h
#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();
};
pregunta.cpp
#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.