вернуть результат системной функции в char * - PullRequest
1 голос
/ 27 июня 2010

Предположим, я делаю system("ps-C nautilus"); как мне вернуть результат этой функции в char *?

Спасибо.

Ответы [ 3 ]

7 голосов
/ 27 июня 2010

Ты не.Не знаю, на какой платформе вы находитесь, но вместо этого посмотрите на функцию popen.Таким образом вы получите двунаправленный канал, с которым вы можете выполнять файловые операции, например, читать, чтобы получить из него строку.

1 голос
/ 30 июня 2010

Если ваш компилятор поддерживает какой-либо вариант popen () , вы можете довольно легко перенаправить вывод.

Предостережения:

  1. Код ниже был написан на коробке Windows, которая использует _popen () вместо popen () . Это не сложно конвертировать для * nix.
  2. Приведенный ниже код не обрабатывает ошибки. Это просто предназначено для иллюстрации техники. Вы должны добавить проверку ошибок, прежде чем использовать ее в работе.
  3. Это все работает в одном потоке. Если программа, вероятно, будет работать в течение длительного времени, вам может понадобиться использовать второй поток, чтобы прочитать ее вывод во время работы.
  4. Я думаю, что popen () - это POSIX, что означает, что он будет работать на большинстве * nix-блоков, но не является стандартным C, поэтому его не следует считать переносимым.
char *RunProg(const char *szCmdLine)
{
  size_t nSize=512;
  size_t nUsed=0;
  char *szOut = malloc(nSize);
  FILE *fp = _popen(szCmdLine, "r");
  char szBuff[128];
  while( !feof( fp ) )
  {
      if( fgets( szBuff, sizeof(szBuff), fp ) != NULL )
      {
          nUsed += strlen(szBuff);
          if (nUsed >= nSize)
          {
              nSize += nUsed;
              szOut = realloc(szOut, nSize);
          }
          strcat(szOut, szBuff);
      }
  }
  _pclose(fp);
  return szOut;
}
0 голосов
/ 27 июня 2010

Самое простое решение, вероятно, выглядит примерно так:

system("ps-C nautilus > /tmp/data.txt");

, затем откройте файл и прочитайте содержимое.

Обновление Очевидно, что вы не будете использоватьжестко закодированное имя файла.В приведенном выше коде я просто иллюстрировал технику.Есть много способов обеспечить уникальность имени вашего файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...