Найти конец потока для 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).
}