【问题标题】:pipeline input data管道输入数据
【发布时间】:2011-05-24 11:07:18
【问题描述】:

我需要编写一个程序来处理来自文件或外壳的输入(用于管道处理)。处理这个问题的最有效方法是什么?我基本上需要逐行读取输入,但输入可能是来自 shell 的另一个程序的输出,或者是一个文件。

谢谢

【问题讨论】:

    标签: c++ file shell input pipeline


    【解决方案1】:

    我认为它是您想要使用的命名管道。但据我所知,其他程序必须将其输出写入命名管道(如果您有权访问该程序,则可以这样做),您的程序将从命名管道读取。

    希望这对您有所帮助。

    【讨论】:

      【解决方案2】:

      我可能误解了这个问题,但我认为您希望您的程序能够像这样使用:cat [some_file] | [your_program][your program] < [some_file]
      如果是这种情况,您只需从标准输入 (stdin/cin) 中读取数据,shell 将负责其余的工作。

      如果您希望程序从标准输入或文件中读取,您可以执行许多命令行实用程序所做的事情,即cat:

      猫 [选项] [文件]...
      ...
      没有 FILE,或者当 FILE 为 - 时,读取 标准输入。

      有关实现上述内容的代码示例,请参阅this 文章。

      【讨论】:

      • 是的,我想你说的就是我要找的。你的意思是我应该使用类似 getline(std::cin, mystring) 的东西?
      • 是否可以将您所说的直接使用到外壳中?例如,如果我希望程序从 shell 中逐行读取...
      • 在上面的例子中,shell 通过创建管道然后在程序之间传输字节使我们的生活变得轻松。如果你想在你的代码中做,那么你必须使用我提到的命名管道或检查“system()”函数来执行 shell 命令。
      【解决方案3】:

      我找不到 cmets 链接,所以发布一个答案。 正如 Eugen Constantin Dinca 所说,管道或重定向只是输出到标准输入,所以你的程序需要做的是从标准输入中读取。

      我不知道你提到的“逐行读取”是什么意思,比如 ftp 交互模式?如果是这样,你的程序中应该有一个循环,它每次读取一行并等待下一个输入,直到你给出终端信号。


      编辑:

      int c;
      while(-1 != (c = getchar()))
          putchar(c);
      

      【讨论】:

      • 逐行阅读我的意思是类似于while(!EOF)或shell的相应字符。虽然没有找到终止字符,但我读取了一行(例如,由 \n 分隔)并处理它
      • 是的,如果您从文件重定向或使用管道,EOF 表示标准输入的结尾。
      【解决方案4】:

      这是来自Echo All Palindromes, in C 的 C 示例:

      int main(int argc, char* argv[]) {
        int exit_code = NO_MATCH;
        if (argc == 1) // no input file; read stdin
          exit_code = palindromes(stdin);
        else {
          // process each input file
          FILE *fp = NULL;
          int ret = 0;
          int i;
          for (i = 1; i < argc; i++) { 
            if (strcmp(argv[i], "-") == 0)
              ret = palindromes(stdin);
            else if ((fp = fopen(argv[i], "r")) != NULL) {
              ret = palindromes(fp);
              fclose(fp);
            } else {
              fprintf(stderr, "%s: %s: could not open: %s\n",
                      argv[0], argv[i], strerror(errno));
              exit_code = ERROR;
            }
            if (ret == ERROR) {
              fprintf(stderr, "%s: %s: error: %s\n",
                      argv[0], argv[i], strerror(errno));
              exit_code = ERROR;
            } else if (ret == MATCH && exit_code != ERROR) 
              // return MATCH if at least one line is a MATCH, propogate error
              exit_code = MATCH;
          }
        }
        return exit_code;
      }
      

      要使其适应 C++:编写接受 std::istream&amp; 的函数(上面是 palindromes);从main() 函数传递std::cin(用于标准输入,或“-”文件名)或ifstream 对象。

      在函数内使用std::getline() 和给定的std::istream 对象逐行读取输入(函数不关心输入是来自文件还是标准输入)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-06
        • 1970-01-01
        • 2018-07-31
        • 2020-01-20
        • 2021-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多