【问题标题】:entering EOF in istream在 istream 中输入 EOF
【发布时间】:2020-04-03 22:24:42
【问题描述】:

有人问我一个问题,要编写一个接受并返回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 才能停止循环 - 还有其他方法可以做到这一点吗?

【问题讨论】:

  • 我很困惑你的问题到底是什么。您的函数实现了第一段中描述的功能。您是否希望它在 之前 EOF 终止?还是您在问是否有其他方法可以从您的外壳发送EOF
  • 注意:while((ob&gt;&gt;s)&amp;&amp;(!ob.eof())) 有点多余。测试ob&gt;&gt;s涵盖了EOF的检测。

标签: c++ io eof


【解决方案1】:

这是意料之中的。

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

否则终端如何知道您希望停止提供输入? EOF 实际上会在哪里?

【讨论】:

    【解决方案2】:

    这是预期的行为。

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

    $ ./my_program < ./some_file.txt
    

    或者,对于cat abusers

    $ cat ./some_file.txt | ./my_program
    

    这本质上相当于执行my_program,然后手动输入some_file.txt 的内容,然后输入CTRL+D

    【讨论】:

    • 这正是我一直在寻找的——一种不需要ctrl + d 的替代方式。
    猜你喜欢
    • 2017-10-18
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    相关资源
    最近更新 更多