如何将系统命令输出存储在变量中?

时间:2011-05-07 07:06:29

标签: c++ c unix system

我正在执行一个system()函数,它返回一个文件名。现在我不想在屏幕上显示输出(即文件名)或管道到新文件。我只想将它存储在一个变量中。那可能吗?如果是这样,怎么样? 感谢

4 个答案:

答案 0 :(得分:5)

单个文件名?是。这当然是可能的,但不能使用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;
}

答案 1 :(得分:3)

您可以使用 popen(3) 并从该文件中读取。

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

所以基本上你运行command,然后从返回的FILE读取。 popen(3)就像系统一样工作(调用shell),所以你应该可以用它运行任何东西。

答案 2 :(得分:1)

这是我的C ++实现,它将system() stdout重定向到日志记录系统。它使用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;
}

答案 3 :(得分:1)

嗯,还有一种简单的方法可以将命令输出存储在一个称为重定向方法的文件中。我认为重定向很容易,在你的情况下它会很有用。

所以例如这是我在c ++中的代码

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

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

此处重定向符号可以轻松地将该命令的所有输出重定向到a.text文件中。