c ++ getline () цикл при использовании в файле с чтением в массиве int?

0

Поэтому я опубликовал это на днях с недостаточной информацией и никогда не получал ответа, как только я добавил запрошенную информацию, поэтому я не могу заставить цикл работать, поэтому мой вопрос: я читаю из файла с большим текстом строк в каждой строке он имеет 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();
}
  • 0
    что вы пытаетесь сделать с questionFile >> answersArray [i]?
  • 0
    @Pandrei: считайте целое число из файла в массив, как описано.
Показать ещё 1 комментарий
Теги:
arrays
loops
getline

1 ответ

3
Лучший ответ

>> будет потреблять номер, но не остаток строки (включая маркер конца строки). Таким образом, следующая строка 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;
}
  • 0
    Это по какой-то причине не позволяет getline вводить данные в questionsArray? это также ломается после 1 цикла
  • 0
    @bilbsy: Извините, я должен был проверить это перед публикацией. Попробуй.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню