c++ - 重定向两个单独的标准输入作为程序的输入

标签 c++ pipe user-input stdin

以下示例输出来自 stdin 的输入:

#include <iostream>

int main(int argc, char **argv)
{
    std::string s1, s2;
    while (getline(std::cin, s1))
    {
        std::cout << s1 << " 1\n";
    }

    while (getline(std::cin, s2))
    {
        std::cout << s2 << "2\n";
    }
    return 0;
}

我像这样运行程序:cat main.cpp | ./main 输出

#include <iostream> 1
 1
int main(int argc, char **argv) 1
{ 1
 1
    std::string s1, s2; 1
    while (getline(std::cin, s1)) 1
    { 1
        std::cout << s1 << " 1\n"; 1
    } 1
         1
    while (getline(std::cin, s2)) 1
    { 1
        std::cout << s2 << "2\n"; 1
    } 1
} 1

有没有办法通过 stdin 将两个单独的输入传送到程序?也就是说,如果我写类似 cat main.cpp cat main.cpp | 的内容./main,那么第一个输入被分配给 s1,第二个输入被分配给 s2

最佳答案

据我所知这是不可能的,但您可以简单地使用两个包含您的输入的文件,将它们作为命令行参数传递并从中读取。

#include <iostream>
#include <fstream>

int main(int argc, char **argv)
{
    if (argc != 3) 
      return -1;

    std::ifstream ifs1(argv[1]);
    std::ifstream ifs2(argv[2]);

    if (!ifs1.is_open() || !ifs2.is_open())
      return -2;

    std::string s1, s2;
    while (getline(ifs1, s1))
    {
      std::cout << s1 << " 1\n";
    }

    while (getline(ifs2, s2))
    {
      std::cout << s2 << "2\n";
    }
    return 0;
}

并这样调用它:

./main main.cpp main.cpp

您甚至可以使其更加灵活,允许您读取任意数量的文件:

#include <iostream>
#include <fstream>

int main(int argc, char **argv)
{
    if (argc == 1) 
      return -1; // no input file given

    for (int i = 1; i < argc; ++i) { 
      std::ifstream ifs(argv[i]);

      if (!ifs.is_open()) {
        std::cout << argv[i] << ":file not found\n";
        continue;
      }

      std::string line;
      while (getline(ifs, line))
      {
        std::cout << line << " " << i << "\n";
      }
    }
}

关于c++ - 重定向两个单独的标准输入作为程序的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45915572/

相关文章:

Javascript - 像谷歌文档一样检测汉字输入

angular - 通过用户在 angular2 中的输入触发方法的最佳实践

c++ - 前导 0 不可能进行基本编码?

c++ - 在 View 上使用 SELECT 时出现“没有这样的列”错误

ffmpeg - 用于视频预览的管道 ffmpeg 输出

c - 如何使用涉及多次读写的管道在子进程和父进程之间实现双向通信

java - 我如何从另一个类获取字符串?

c++ - C++ 中 else 语句的最大数量

c++ - 适用于混合 Windows 应用程序的可嵌入单元测试框架

c - 登录进程作为协进程