C/C ++의 프로그램 변수로 DOS 명령의 출력을 읽고 리디렉션하는 방법은 무엇입니까?
문제
"Dir"명령과 같은 프로그램에서 DOS 명령을 실행하고 싶습니다. 나는 그것을하고있다.
system("dir");
해당 명령의 출력을 프로그램 변수로 직접 읽을 수있는 방법이 있습니까?
우리는 항상 출력을 파일로 리디렉션 한 다음 해당 파일을 읽을 수 있습니다.
system("dir > command.out");
그런 다음 명령 .out 파일을 읽습니다. 그러나 파일로 리디렉션하고 읽는 대신 어떻게 직접 수행 할 수 있습니까?
해결책 3
Popen과 동등한 대체 방법 또는 오히려 Windows를 찾았습니다. _popen ()입니다. 이것은 나에게 적합하며 사용하기 쉽습니다.
char psBuffer[128];
FILE *pPipe;
if( (pPipe = _popen( "dir", "rt" )) != NULL)
{
while(fgets(psBuffer, 128, pPipe))
{
printf(psBuffer);
}
}
전체 예제로 세부 사항을 찾으십시오 여기.
다른 팁
변수로 리디렉션 할 수는 없지만 체인 명령에 파이프를 사용하는 방법과 유사한 트릭을 수행 할 수 있습니다. 부르다 CreateProcess()
, 그리고 그것을 통과합니다 STARTUPINFO
그에 따라 설정된 인스턴스와 인스턴스 STARTF_USESTDHANDLES
안에 STARTUPINFO::dwFlags
. 그런 다음 세트 핸들을 통해 스폰 된 프로세스에서 나오는 데이터를 읽으십시오.
도서관이있는 경우 popen()
POSIX 기능, 그것이 당신이 필요로하는 것입니다. 파이프에서 명령 출력을 읽고 원하는 방식으로 구문 분석 할 수 있습니다.
FILE *dir;
char direntry[80];
dir = popen("dir", "r");
while (!feof(dir)) {
fgets(direntry, sizeof(direntry), dir);
/* do something with direntry */
}
당신은 할 수 없습니다. 프로그램은 다른 프로세스이므로 다른 메모리 공간에서 실행됩니다. 일반적으로 현대 운영 체제에서 프로세스는 메모리를 공유하지 않습니다.
또한 "DIR"과 같은 명령의 출력을 보유 할 수있는 C에서 변수를 정의하는 것은 어려울 것입니다. 공간을 만들기 위해 동적으로 성장해야합니다.
가장 좋은 방법은 사용하는 것입니다 파이프, 그것은 스트림에서 명령의 출력을 읽을 수있게 해주므로, 당신은 당신이 맞는대로 보관할 수 있습니다.
Popen ()을 사용하여 원하는 것을 정확하게 수행하십시오.
양방향 파이프를 생성하고 프로세스를 포크합니다. 어린이에서는 파이프를 표준으로 연결하고 표준 OUT을 연결 한 다음 첫 번째 매개 변수로 지정된 명령을 Popen ()에 실행합니다.
#include <stdio.h>
#include <string>
#include <iostream>
int main()
{
std::string output;
FILE* data = popen("cat PLOP","r");
for(char c = getc(data);c != EOF;c = getc(data))
{
output += c;
}
pclose(data);
std::cout << "Data(" << output << ")\n";
}