代码之家  ›  专栏  ›  技术社区  ›  kolrie

在C/C++中适当地从管道获得输出

  •  2
  • kolrie  · 技术社区  · 14 年前

    static const int BUFFER_SIZE=512;
    
    // (...)
    
    FILE* pipe;
    char buffer[BUFFER_SIZE];
    
    // (...)
    
    if (!(pipe = popen(cmd.c_str(), "r"))) {
      out("\nProblem executing command: " + cmd + "\n");
      return 1;
    }
    
    while (!feof(pipe)) {
      int read = fread(buffer, sizeof(char), sizeof buffer, pipe);
      int pos = -1;
      int i;
    
      for (i = 0; i < strlen(buffer); i++) {
        if (buffer[i] == '\n') {
          pos = i;
        }
      }
    
      // ... get a substring from buffer var from 0 to pos,
      // and set a "reminder" var with pos+1 to end of string
    }
    

    它在处理一个小问题:我看到缓冲区的末尾包含一些非ascii字符,这些字符会把我以后对字符串(我在注释中提到的子字符串)所做的每一个操作都弄乱。

    下面是我看到的一个例子:

    Error example

    由于我是C/C++初学者,我想问一下我如何才能捕获进程输出并将它流到其他地方,必要时将其拆分。代码可以是C或C++。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Doug Currie    14 年前

    fread 不NUL终止缓冲区,所以 strlen 不合适。

    read 限制你的循环。