在C / C ++中正确获取管道输出

时间:2010-10-03 03:31:52

标签: c++ c pipe

我正在编写C / C ++代码来运行shell命令并捕获输出:

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 个答案:

答案 0 :(得分:1)

fread没有NULL终止缓冲区,因此strlen不合适。

使用结果read来限制循环。