在 istream 中输入 EOF

entering EOF in istream

提问人:Agrudge Amicus 提问时间:4/4/2020 更新时间:4/4/2020 访问量:237

问:

有人问我一个问题,要我写一个函数,该函数接受并返回一个.该函数应读取流,直到它命中,并且读取的值应使用标准输出打印。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;
}

唯一没有发生的部分是程序 () 到达 - 我必须手动进入终端才能停止循环 - 还有其他方法可以做到这一点吗?istreamEOFctrl + d

C++ IO EOF

评论

1赞 Brian61354270 4/4/2020
我很困惑你的问题到底是什么。您的函数实现了第一段中描述的功能。你想让它终止吗?或者你是在问是否有另一种方法可以从你的 shell 发送一个?EOFEOF
0赞 user4581301 4/4/2020
几乎重复:stackoverflow.com/questions/16136400/......
4赞 user4581301 4/4/2020
注意:有点超出必要范围。EOF 的检测包含在测试中。while((ob>>s)&&(!ob.eof()))ob>>s

答:

4赞 Asteroids With Wings 4/4/2020 #1

这是意料之中的。

Ctrl+D 是发出 EOF 信号的方式。

否则,终端如何知道您希望停止提供输入?EOF到底在哪里?

3赞 Brian61354270 4/4/2020 #2

这是预期的行为。

假设您处于 Unix-y 环境中,您也可以通过从 shell 重定向将输入通过管道传输到程序的 stdin:

$ ./my_program < ./some_file.txt

或者,对于虐待的人来说

$ cat ./some_file.txt | ./my_program

这实质上等同于执行,然后手动键入 的内容,然后是 。my_programsome_file.txtCTRL+D

评论

1赞 Agrudge Amicus 4/4/2020
这正是我一直在寻找的 - 一种不需要的替代方式。ctrl + d