zie*_*141 9 c++ linux shell stdin stdout
我编写了一个简单的 C++ 程序用于教程目的。我的目标是无限循环。
#include <iostream>
#include <string>
int main()
{
std::cout << "text";
for(;;) {
std::string string_object{};
std::getline(std::cin, string_object);
std::cout << string_object;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译后我像这样运行它:
./bin 0>&1
我期望发生的是输出到标准输出的“文本”,它现在也将成为程序的标准输入并且它将永远循环。为什么不发生?
首先,打印到 时需要输出换行符std::cout,否则std::getline()将无法读取任何完整行。
改良版:
#include <iostream>
#include <string>
int main()
{
std::cout << "stars" << std::endl;
for(;;) {
std::string string_object;
std::getline(std::cin, string_object);
std::cout << string_object << std::endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在试试这个:
./bin >file <file
Run Code Online (Sandbox Code Playgroud)
您看不到任何输出,因为它会发送到文件。但是如果你停止程序并查看文件,你会发现它充满了
stars
stars
stars
stars
Run Code Online (Sandbox Code Playgroud)
:-)
另外,当您尝试时反馈循环无法启动的原因
./bin 0>&1
Run Code Online (Sandbox Code Playgroud)
也就是说,您最终会连接到 stdin 和 stdout /dev/tty
(这意味着您可以看到输出)。
但是 TTY 设备永远无法关闭循环,因为它实际上由两个独立的通道组成,一个将输出传递到终端,一个将终端输入传递到进程。
如果您使用常规文件进行输入和输出,则可以关闭循环。如果进程的标准输入连接到该文件,则写入该文件的每个字节也将从该文件中读取。只要没有其他进程同时从文件读取,因为流中的每个字节只能读取一次。