Таким образом, цикл while в нижней части этого следующего кода просто просто циклы непрерывно, я работал, прежде чем добавить строку
questionFile >> answersArray[i];
Кажется, что эта строка нарушает его, так что ничего больше не записывается в questionsArray, я довольно тупик от этого, поэтому нам будет по достоинству оценена помощь.
ifstream questionFile;
int i = 0;
switch (x){
case 1:
questionFile.open("Topic1 Questions.txt", ios::app);
break;
case 2:
questionFile.open("Topic2 Questions.txt", ios::app);
break;
case 3:
questionFile.open("Topic3 Questions.txt", ios::app);
break;
case 4:
questionFile.open("Topic4 Questions.txt", ios::app);
break;
}
if (!questionFile)
{
cout << "Cannot load file" << endl;
}
else
{
if (questionFile.peek() != ifstream::traits_type::eof()) {
while (!questionFile.eof())
{
getline(questionFile, questionsArray[i]);
questionFile >> answersArray[i];
i++;
}
}
questionFile.close();
}
Оба getline
и operator>>
извлекают из файла, но getline
читает до '\n' (или любого символа, который вы указываете), пока operator>>
читает до пробела. Кроме того, operator>>
оставит "\n" в потоке, вызывает следующий вызов getline
чтобы ничего не читать.
Прочтите документацию getline
и operator>>
для получения более подробной информации (это ссылки).
Также опубликуйте формат, в котором вопросы/ответы хранятся в файле, потому что, как ваш код будет работать, очень зависит от этого. Если вы просто ожидаете чередующихся вопросов и ответов, просто используйте getline
и забудьте оператора.
Надеюсь, это поможет.
Это немного сложно (хорошо, невозможно, действительно), чтобы быть уверенным в вашей проблеме, не видя таких вещей, как тип answersArray
. Это также поможет (много) увидеть, какой образец входного файла вы хотите прочитать.
На данный момент я предполагаю, что ваш файл ввода выглядит примерно так:
1) air 2) earth 3) fire 4) water
3
1) Solid 2) Liquid 3) Gas 4) Plasma
2
т.е. одна строка представляет собой строку (содержащую вопросы или возможные ответы, или, возможно, и то, и другое), а следующая строка - это одно число, означающее правильный ответ (или что-то в этом порядке).
Предполагая, что в этом случае я прочитал бы все данные из самого входного файла, используя std::getline
. Тогда я разделил бы это на нужные части.
Я бы, вероятно, также создал класс answer
(или что-то подобное) для хранения как строки, так и числа, а также operator>>
перегрузки operator>>
для этого класса для чтения обоих.
struct answer {
std::string question;
int answer;
friend std::istream &operator>>(std::istream &is, answer &a) {
std::getline(is, a.question);
std::string temp;
std::getline(is, temp);
a.answer = boost::lexical_cast<int>(temp);
return is;
}
};
Используя это, чтение данных из файла может выглядеть примерно так:
std::vector<answer> answers{
std::istream_iterator<question>(questionFile),
std::istream_iterator<question>()};
Это считывает данные из файла и помещает элементы, которые он считывает, в вектор, который я назвал answers
.
Пока мы это делаем, я также изменил бы код, чтобы открыть файл, по крайней мере, немного. ios::app
действительно имеет смысл, если вы собираетесь писать в файл, а не просто читать. Во-вторых, аргумент case для выбора жестко закодированных имен файлов кажется немного неуклюжим, по крайней мере для меня.
Вероятно, я бы написал, что часть кода выглядит примерно так:
if (x<0 || x > 4)
throw std::runtime_error("prohibited file name");
std::stringstream name << "Topic" << x << " Questions.txt";
std::ifstream questionFile(name.str());
while (getline(questionFile, questionsArray[i]))