Как сохранить вывод системной команды в переменной? - PullRequest
4 голосов
/ 07 мая 2011

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

Ответы [ 4 ]

5 голосов
/ 07 мая 2011

Одно имя файла? Да. Это, конечно, возможно, но без использования system().

Используйте popen(). Это доступно в и , вы пометили свой вопрос обоими, но, вероятно, собираетесь кодировать один или другой.

Вот пример на C:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    FILE *fpipe;
    char *command = "ls";
    char c = 0;

    if (0 == (fpipe = (FILE*)popen(command, "r")))
    {
        perror("popen() failed.");
        exit(1);
    }

    while (fread(&c, sizeof c, 1, fpipe))
    {
        printf("%c", c);
    }

    pclose(fpipe);

    return -1;
}
3 голосов
/ 07 мая 2011

Вы можете использовать popen(3) и читать из этого файла.

FILE *popen(const char *command, const char *type);

Таким образом, вы запускаете command, а затем читаете из FILE вернулся.popen (3) работает так же, как system (вызывает оболочку), поэтому вы должны иметь возможность запускать что угодно с ним.

1 голос
/ 10 февраля 2018

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

так Например, это мой код на C ++

#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;

int main(){
   system("ls -l >> a.text");
  return 0;
}

Здесь знак перенаправления легко перенаправитьвесь вывод этой команды в текстовый файл.

1 голос
/ 01 августа 2014

Вот моя реализация на C ++, которая перенаправляет стандартный вывод system() в систему ведения журнала. Он использует GNU libc getline(). Он сгенерирует исключение, если не сможет выполнить команду, но не сгенерирует, если команда выполняется с ненулевым статусом.

void infoLogger(const std::string& line); // DIY logger.


int LoggedSystem(const string& prefix, const string& cmd)
{
    infoLogger(cmd);
    FILE* fpipe = popen(cmd.c_str(), "r");
    if (fpipe == NULL)
        throw std::runtime_error(string("Can't run ") + cmd);
    char* lineptr;
    size_t n;
    ssize_t s;
    do {
        lineptr = NULL;
        s = getline(&lineptr, &n, fpipe);
        if (s > 0 && lineptr != NULL) {
            if (lineptr[s - 1] == '\n')
                lineptr[--s  ] = 0;
            if (lineptr[s - 1] == '\r')
                lineptr[--s  ] = 0;
            infoLogger(prefix + lineptr);
        }
        if (lineptr != NULL)
            free(lineptr);
    } while (s > 0);
    int status = pclose(fpipe);
    infoLogger(String::Format("Status:%d", status));
    return status;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...