Найти конец потока для cin & ifstream?
Я запускаю себя через текстовую книгу C++, которая у меня есть в качестве обновления для программирования на C++. Одна из проблем практики (не вдаваясь в подробности) хочет, чтобы я определил функцию, которая может быть передана ifstream или cin (например, istream) в качестве аргумента. Оттуда я должен читать через ручей. Проблема в том, что я не могу найти способ получить это один функция используйте cin и ifstream для эффективного поиска конца потока. А именно:
while(input_stream.peek() != EOF)
не буду работать на Син. Я мог бы переработать функцию, чтобы найти определенную фразу (например," #End of Stream# " или что-то еще), но я думаю, что это плохая идея, если поток файлов, который я передаю, имеет эту точную фразу.
Я думал использовать перегрузку функций, но до сих пор книга упоминала, когда она хочет, чтобы я это сделал. Я, вероятно, вкладываю слишком много усилий в эту проблему с практикой, но мне нравится творческий процесс, и мне интересно, есть ли такой способ сделать это без перегрузка.
3 ответов
eof()
тут работа для cin. Вы делаете что-то неправильно, пожалуйста, напишите ваш код. Одним из распространенных камней преткновения является то, что eof
флаг устанавливается после вы пытаетесь читать за концом потока.
вот пример:
#include <iostream>
#include <string>
int main( int, char*[] )
{
std::string s;
for ( unsigned n = 0; n < 5; ++n )
{
bool before = std::cin.eof();
std::cin >> s;
bool after = std::cin.eof();
std::cout << int(before) << " " << int(after) << " " << s << std::endl;
}
return 0;
}
и на его выходе:
D:>t
aaaaa
0 0 aaaaa
bbbbb
0 0 bbbbb
^Z
0 1 bbbbb
1 1 bbbbb
1 1 bbbbb
(EOF может быть сгенерирован с помощью Ctrl-Z на Windows и Ctrl-D на многих других ОС)
почему std::cin.eof()
работы? cin
будет сигнализировать EOF, когда stdin закрывается, что произойдет, когда пользователь сигнализирует об этом с Ctrl+d (*nix) или Ctrl+z (Windows) или (в случае конвейерного входного потока), когда конвейерный файл заканчивается
Если вы используете поток в логическом контексте, он преобразуется в значение, эквивалентное true, если он не достиг EOF и false, если была сделана попытка прочитать мимо EOF (не это также false, если была предыдущая ошибка чтения из потока).
Так как большинство операций ввода-вывода в потоках возвращают поток (поэтому они могут быть прикованы). Вы можете выполнить операцию чтения и использовать результат в тесте (как указано выше).
Итак, программа для чтения поток чисел из потока:
int main()
{
int x;
// Here we try and read a number from the stream.
// If this fails (because of EOF or other error) an internal flag is set.
// The stream is returned as the result of operator>>
// So the stream is then being used in the boolean context of the while()
// So it will be converted to true if operator>> worked correctly.
// or false if operator>> failed because of EOF
while(std::cin >> x)
{
// The loop is only entered if operator>> worked correctly.
std::cout << "Value: " << x << "\n";
}
// Exit when EOF (or other error).
}