Поэтому я опубликовал это на днях с недостаточной информацией и никогда не получал ответа, как только я добавил запрошенную информацию, поэтому я не могу заставить цикл работать, поэтому мой вопрос: я читаю из файла с большим текстом строк в каждой строке он имеет ints на следующей строке, строки должны быть прочитаны в questionArrays() и ints в answerArrays.
В настоящее время цикл просто разворачивается один раз, а затем просто циклы, так как он больше не попадает в файл на следующей линии getline(). У меня было это без чтения части ints, поэтому я предполагаю, что это то, что его нарушает. Файл также в настоящее время упорядочивается в порядке строки, затем int, затем string, затем int и т.д., Если есть способ разбить их на чтение, это также будет принятым ответом.
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
будет читать пустую строку, а следующая >>
завершится неудачно, помещая поток в плохое состояние, которое вы не проверяете. Затем он будет зацикливаться навсегда, ничего не читая и никогда не дойдя до конца файла.
Тебе нужно:
Лучшая структура цикла может выглядеть примерно так:
while (getline(questionFile, questionsArray[i])) {
if (questionFile >> answersArray[i]) {
questionFile.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
} else {
throw std::runtime_error("Missing answer"); // or handle the error somehow
}
++i;
}