在istream中输入EOF
entering EOF in istream
我被问到一个问题,要编写一个接受 returns 和 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
来停止循环 - 有没有其他方式来做到这一点?
这是预期的。
Ctrl+D 是发出 EOF 信号的方式。
否则终端如何知道您希望停止提供输入? EOF 实际上在哪里?
这是预期的行为。
假设您处于 Unix-y 环境中,您也可以通过从 shell:
重定向将输入管道输入到程序的标准输入
$ ./my_program < ./some_file.txt
或者,对于 cat
abusers,
$ cat ./some_file.txt | ./my_program
这基本上等同于执行 my_program
,然后手动输入 some_file.txt
的内容,然后输入 CTRL+D
。
我被问到一个问题,要编写一个接受 returns 和 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
来停止循环 - 有没有其他方式来做到这一点?
这是预期的。
Ctrl+D 是发出 EOF 信号的方式。
否则终端如何知道您希望停止提供输入? EOF 实际上在哪里?
这是预期的行为。
假设您处于 Unix-y 环境中,您也可以通过从 shell:
重定向将输入管道输入到程序的标准输入$ ./my_program < ./some_file.txt
或者,对于 cat
abusers,
$ cat ./some_file.txt | ./my_program
这基本上等同于执行 my_program
,然后手动输入 some_file.txt
的内容,然后输入 CTRL+D
。