ввод EOF в istream - PullRequest
       31

ввод EOF в istream

0 голосов
/ 04 апреля 2020

Мне задали вопрос, чтобы написать функцию, которая принимает и возвращает istream&. Функция должна читать поток до тех пор, пока он не достигнет EOF, а считанное значение должно быть напечатано со стандартным выводом.

Вот мой код, который работает почти нормально:

#include<iostream>
#include<string>
#include<istream>


std::istream& fun(std::istream &ob)
{
    std::string s;
    while((ob>>s)&&(!ob.eof()))
        std::cout<<s<<'\n';
    return ob;
}

int main()
{
    std::istream &obj = fun(std::cin);
    return 0;
}

Единственная часть что не происходит, если программа (istream) достигает EOF - мне нужно вручную ввести ctrl + d на терминале, чтобы остановить l oop - есть ли другой способ сделать это?

Ответы [ 2 ]

4 голосов
/ 04 апреля 2020

Это ожидаемо.

Ctrl + D - это то, как вы сигнализируете EOF.

Иначе как терминал узнает, что вы sh перестанете предоставлять ввод? Где на самом деле будет EOF?

3 голосов
/ 04 апреля 2020

Это ожидаемое поведение.

Предполагая, что вы находитесь в Unix -й среде, вы могли бы альтернативно направить ввод в stdin вашей программы через перенаправление из оболочки:

$ ./my_program < ./some_file.txt

Или, для cat злоумышленников ,

$ cat ./some_file.txt | ./my_program

Это, по сути, эквивалентно выполнению my_program и последующей ручной печати содержимого some_file.txt, за которым следует CTRL+D.

...