如何存储system()调用的输出?

时间:2011-04-05 08:57:06

标签: c++ linux

我在c ++程序中使用Linux上的system(3)。现在我需要将system(3)的输出存储在数组或序列中。我如何存储system(3)的输出。

我正在使用以下内容:

system("grep -A1 \"<weakObject>\" file_name | grep \"name\" |
    grep -Po \"xoc.[^<]*\" | cut -d \".\" -f5 ");  

给出输出:

changin 
fdjgjkds 
dglfvk
dxkfjl

我需要将此输出存储到字符串数组或字符串序列。

提前致谢

3 个答案:

答案 0 :(得分:6)

system会产生一个新的shell进程,该进程没有通过管道或其他东西连接到父进程。

您需要使用popen库函数。然后读取输出并在遇到换行符时将每个字符串推入数组。

FILE *fp = popen("grep -A1 \"<weakObject>\" file_name | grep \"name\" |
grep -Po \"xoc.[^<]*\" | cut -d \".\" -f5 ", "r");
char buf[1024];

while (fgets(buf, 1024, fp)) {
  /* do something with buf */
}

fclose(fp);

答案 1 :(得分:6)

您应该使用popen来读取stdin的命令输出。所以,你会做类似的事情:

FILE *pPipe;
pPipe = popen("grep -A1 \"\" file_name | grep \"name\" | grep -Po \"xoc.[^<]*\" | cut -d \".\" -f5 ", "rt")

以读取文本模式打开它,然后使用fgets或类似的东西从管道中读取:

fgets(psBuffer, 128, pPipe)

答案 2 :(得分:0)

The esier way:

std::stringstream  result_stream;
std::streambuf     *backup  = std::cout.rdbuf( result_stream.rdbuf() );

int res = system("grep -A1 \"<weakObject>\" file_name | grep \"name\" |
grep -Po \"xoc.[^<]*\" | cut -d \".\" -f5 ");

std::cout.rdbuf(backup);

std::cout << result_stream.str();