Нужно в цикле читать слово из файла. Цикл должен работать до тех пор, пока в файле есть строки. Читаю строки так:
std::ifstream val("val.txt");
char val2[16] ;
val >> val2;
Нужно в цикле читать слово из файла. Цикл должен работать до тех пор, пока в файле есть строки. Читаю строки так:
std::ifstream val("val.txt");
char val2[16] ;
val >> val2;
Проверяйте на успешность каждую операцию чтения:
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 утилита может делать.
Скорее всего автор пытался сказать, как проверить, закончился ли файл:
if(val.eof())
break;
И да, читаете Вы слово, а не строку.
while(val>>val2){...}. А с проверкой eof() - вечная проблема, потому как ее начинают использовать как while(!val.eof()){...}, а потом сюда вопросы пишут, почему не работает...
– Harry
Jan 22 '18 at 19:43
getline. – Harry Jan 22 '18 at 18:19val >> val2;- вы читаете не строку, а слово. Если вас устраивает чтение не по строкам, а по словам - можно и так. Но опасно - слово может быть длиннее, чем ваш буфер. Но опять же - что возвращает инструкцияval >> val2;? – Harry Jan 22 '18 at 18:43