Как заставить getline не пропускать строку из текстового файла, когда я вызываю другую функцию для чтения следующих нескольких строк в текстовом файле - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь создать программу, которая будет считывать ввод из текстового файла и вызывать функцию, когда она обнаруживает «1» в текстовом файле. Когда программа обнаружит «1» в текстовом файле, она вызовет ReadLines (fstream & file). Readlines () прочитает следующие 4 строки в программе. У меня проблема в том, что после вызова Readlines () l oop внутри main не читает следующую строку в текстовом файле. Он пропускает его и продолжает читать файл, пока l oop создается в main.

fstream file("paper.txt");
std::string str;

//Check if file is open
if (file.is_open()) {
    cout << "File is open" << endl;
}
else {
    cout << "File is not open" << endl;
    return 0;
}

//Get line from text file until it is at the end of file
while (std::getline(file, str)) {
    //Print the current line
    std::cout << str << endl;

    //If getline detects a "1", call ReadLines function
    if (str == "1") {
        cout << "---enter loop----" << endl;
        ReadLines(file);
    }
}

file.close();
return 0;

}

void ReadLines(fstream& file) {
int i = 1;
std::string str;

//Read the next 4 lines
while (std::getline(file, str) && i < 5) {
    std::cout << str << endl;
    i++;
}

cout << "--exit loop--" << endl;

}

Вот содержимое текстового файла

1
234
10
12.5
tacos
1
123
12
23.22
cake

Как видите, «1» дважды виден в текстовом файле. Кажется, что l oop внутри функции ReadLines работает нормально, но после того, как l oop возвращается к основному l oop, основной l oop не обнаруживает второе «1». Он пропускает его и не вызывает функцию ReadLines.

1 Ответ

1 голос
/ 09 апреля 2020

Ваш while условный в ReadLines выполняется 5 раз. Один раз, когда i == 1, i == 2, ... и i == 5. При последнем выполнении оно, наконец, оценивается как false, но только после того, как getline будет оценено (выполнено), i < 5 будет оценено как false. Вы не вводите тело l oop, поэтому прочитанная строка отбрасывается.

Поменяйте местами порядок условных операторов вокруг вашего &&, чтобы i < 5 вычислялся первым, short схемы и не выполняются getline при i == 5.

...