Правильно получать вывод из канала в C / C ++ - PullRequest
2 голосов
/ 03 октября 2010

Я пишу код на C / C ++ для запуска команды оболочки и захвата вывода:

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 Ответ

1 голос
/ 03 октября 2010

fread не NUL завершает буфер, поэтому strlen не подходит.

Используйте результат read для ограничения вашего цикла.

...