如何将程序输出重定向为输入

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 我期望发生的是输出到标准输出的“文本”,它现在也将成为程序的标准输入并且它将永远循环。为什么不发生?

kis*_*sch 2

首先,打印到 时需要输出换行符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 设备永远无法关闭循环,因为它实际上由两个独立的通道组成,一个将输出传递到终端,一个将终端输入传递到进程。

如果您使用常规文件进行输入和输出,则可以关闭循环。如果进程的标准输入连接到该文件,则写入该文件的每个字节也将从该文件中读取。只要没有其他进程同时从文件读取,因为流中的每个字节只能读取一次。