Найти конец потока для cin & ifstream? - PullRequest
7 голосов
/ 30 августа 2010

Я бегу через учебник по С ++, который у меня есть, как курс по программированию на С ++.Одна из практических проблем (не вдаваясь в подробности) требует, чтобы я определил функцию, которую можно передать ifstream или cin (например, istream) в качестве аргумента.Оттуда я должен прочитать поток.Проблема в том, что я не могу найти способ заставить эту одну функцию использовать cin и ifstream для эффективного нахождения конца потока.А именно,

while(input_stream.peek() != EOF)

не будет работать для cin.Я мог бы переработать функцию, чтобы найти определенную фразу (например, «#End of Stream #» или что-то в этом роде), но я думаю, что это плохая идея, если поток файлов, который я передаю, имеет именно эту фразу.Я думал использовать перегрузку функций, но до сих пор книга упоминала, когда она хочет, чтобы я сделал это.Вероятно, я прикладываю слишком много усилий для решения этой проблемы, но мне нравится творческий процесс, и мне любопытно, есть ли такой способ сделать это без перегрузки.

Ответы [ 3 ]

6 голосов
/ 30 августа 2010

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 во многих других ОС)

2 голосов
/ 30 августа 2010

Если вы используете поток в логическом контексте, он преобразуется в значение, эквивалентное 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).
}
2 голосов
/ 30 августа 2010

Почему не std::cin.eof() не работает?cin будет сигнализировать EOF при закрытии stdin, что произойдет, когда пользователь подаст сигнал с помощью Ctrl + d (* nix) или Ctrl + z (Windows) или (вслучай входного потока по трубопроводу), когда файл по конвейеру заканчивается

...