C/C++如何在代码中获取shell命令的输出

例如find.-name"A.txt"这条命令,查找到a.txt后会输出“路径/a.txt”。如果我在C++代码中用system("find.-name"A.txt"")... 例如 find . -name "A.txt"这条命令,查找到a.txt后会输出 “路径/a.txt”。
如果我在C++代码中用system("find . -name "A.txt"")执行了该条命令,那么如何用某个自定义的字符串取到 “路径/a.txt” 这段字符串呢?
system("find . -name "A.txt"");
string strFileName = ???

(不想把命令结果导入临时文件,然后读文件...)
展开
 我来答
百度网友6dc5d8b
2013-06-06 · TA获得超过721个赞
知道小有建树答主
回答量:390
采纳率:100%
帮助的人:278万
展开全部

在windows下面这个的确是需要用管道来实现的

VC6参考代码:

#include <windows.h>

#include <stdio.h>

BOOL ExcudeCmd(char *szOutPutBuf,char *szCmdLine)

{

SECURITY_ATTRIBUTES sa; 

HANDLE hRead,hWrite;

sa.nLength = sizeof(SECURITY_ATTRIBUTES); 

sa.lpSecurityDescriptor = NULL; 

sa.bInheritHandle = TRUE; //输出重定向

if (!CreatePipe(&hRead,&hWrite,&sa,0)) 

printf("创建匿名管道失败");

return FALSE; 

STARTUPINFO si; 

PROCESS_INFORMATION pi; 

ZeroMemory(&si,sizeof(STARTUPINFO));

si.cb = sizeof(STARTUPINFO); 

si.hStdInput=hRead;

si.hStdError = GetStdHandle(STD_ERROR_HANDLE);            //把创建进程的标准错误输出重定向到管道输入 

si.hStdOutput = hWrite;           //把创建进程的标准输出重定向到管道输入 

si.wShowWindow = SW_HIDE;

si.dwFlags =STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; 


if (!CreateProcess(NULL, szCmdLine,NULL,NULL,TRUE,0,NULL,NULL,&si,&pi)) 

CloseHandle(hWrite); 

CloseHandle(hRead); 

printf("创建子进程失败"); 

return FALSE; 

else

{

CloseHandle(pi.hProcess);

CloseHandle(pi.hThread);

}

DWORD bytesRead; 

if (!ReadFile(hRead,szOutPutBuf,1000,&bytesRead,NULL)) 

{

printf("读数据失败"); 

return FALSE;

}

CloseHandle(hRead); 

return TRUE;

}


int main()

{

char cmdline[]="cmd.exe /c echo 回显的信息",buf[1000];

ZeroMemory(buf,100);

ExcudeCmd(buf,cmdline);

printf(buf);//buf就是你想要的东西

}

Linux下面就不清楚了

zhuhuaizhong
2013-06-06 · TA获得超过7276个赞
知道大有可为答主
回答量:3978
采纳率:63%
帮助的人:3635万
展开全部

您可以试下类似的代码,popen 函数在 vc6 中对应的应该是 _popen ,pclose 为 _pclose

或者百度 “c++ 获取 system 的输出” 您可以得到很多类似的问题的解决方案。

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

void executeCMD(const char *cmd, char *result)
{
    char buf_ps[1024];
    char ps[1024]={0};
    FILE *ptr;
    strcpy(ps, cmd);
    if((ptr=popen(ps, "r"))!=NULL)
    {
        while(fgets(buf_ps, 1024, ptr)!=NULL)
        {
           strcat(result, buf_ps);
           if(strlen(result)>1024)
               break;
        }
        pclose(ptr);
        ptr = NULL;
    }
    else
    {
        printf("popen %s error\n", ps);
    }
}

int main()
{
        char result[1024];
        executeCMD("find . -name \"A.txt\"", result);
        printf("%s", result );
        return 0;
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
姜姜atY8
推荐于2018-03-07
知道答主
回答量:21
采纳率:0%
帮助的人:16.3万
展开全部

popen,可以执行一个进程,其反回一个文件指针,就可以读取进程执行的结果!

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

int main()
{
    FILE *pf = popen("ls ./", "r");
    char res[1024];
    fread(res, 1024, 1, pf);
    printf("----%s---\n", res);
    pclose(pf);
    return 0;
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
沫神钢虚1F
2017-01-10 · TA获得超过2.4万个赞
知道大有可为答主
回答量:1.6万
采纳率:59%
帮助的人:1152万
展开全部
  示意流程如下:
return_code = system("shell command") ;
if (return_code == 1)
do something ;
else if (return_code == 2)
do something ;
else
do something ;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友d94c11c
2013-06-06
知道答主
回答量:23
采纳率:0%
帮助的人:9.6万
展开全部
WINDOWS环境可以用管道
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式