Читать строки из файла, пока они есть

235
25 января 2018, 19:46

Нужно в цикле читать слово из файла. Цикл должен работать до тех пор, пока в файле есть строки. Читаю строки так:

std::ifstream val("val.txt"); 
char val2[16] ; 
val >> val2;
Answer 1

Скорее всего автор пытался сказать, как проверить, закончился ли файл:

if(val.eof())
   break;

И да, читаете Вы слово, а не строку.

Answer 2

Проверяйте на успешность каждую операцию чтения:

ifstream file("val.txt");
for (string word; file >> word; ) 
  ; // здесь что-то с word можно сделать

Цикл заканчивается когда произошла ошибка либо наступил конец файла. Никаких file.eof() нет в условии цикла. Только после цикла, после чтения имеет смысл вызвать file.eof(), чтобы узнать наступил ли конец файла. К примеру, чтобы вернуть статус возврата из main():

return !file.eof(); // успех, если дошли до конца файла

Для чтения строк можно использовать getline():

while(getline(cin, line)) // count words
    ++counter[line];
if (!cin.eof())
    return 1; // I/O error

Обратите внимание, возвращаемое значение getline() проверяется после каждого вызова, cin.eof() внутри цикла чтения не используется и вызывается после окончания чтения. Если конец файла не достигнут, то это считается ошибкой в этом случае.

Аналогично при неявных >>-операциях. К примеру, чтобы найти слово в файле, можно использовать istream_iterator<>:

ifstream file("input.txt");
istream_iterator<string> eof;
bool found = find(istream_iterator<string>(file), eof, word) != eof;

Снова, file.eof() при чтении файла не используется. Можно в конце вызвать .eof() метод, чтобы узнать произошла ли ошибка:

int main() {
    ...
    return found ? 0 : (cin.eof() ? 1 : 2);
}

В этом случае, нулевой статус означает что слово найдено, а cin.eof() позволяет различить случаи когда слово не присутствует (возвращается 1) от случая когда ошибка произошла (возвращается 2) -- как это grep утилита может делать.

READ ALSO
Использование библиотеки boost

Использование библиотеки boost

Ребят, пытаюсь разобраться с библиотекой boostНужны большие числа

256
Вызов конструктора С++

Вызов конструктора С++

Доброго времени суток

181
Появились ли в Стандарте С++ отражения?

Появились ли в Стандарте С++ отражения?

Есть у меня проект интерпретатора Basic, написанный на С++Проект довольно давний, ему уже лет 20

233