C/C ++의 프로그램 변수로 DOS 명령의 출력을 읽고 리디렉션하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1404189

  •  05-07-2019
  •  | 
  •  

문제

"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";
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top