IT이야기

C에서 외부 프로그램을 실행하고 출력을 구문 분석하려면 어떻게 해야 하는가?

cyworld 2022. 5. 20. 21:40
반응형

C에서 외부 프로그램을 실행하고 출력을 구문 분석하려면 어떻게 해야 하는가?

나는 게임이 요구하는 파일 목록을 출력하는 유틸리티를 가지고 있다.어떻게 하면 그 유틸리티를 C 프로그램 내에서 실행하고 출력을 가져와 같은 프로그램 내에서 작동할 수 있을까?

UPDATE: 정보 부족에 대한 좋은 확인.이 유틸리티는 일련의 문자열을 뱉어내고, 이것은 Mac/Windows/Linux에서 휴대할 수 있도록 되어 있다.유틸리티를 실행하고 출력을 유지하는 프로그래밍 방식(stdout으로 이동)을 찾고 있습니다,

다른 사람들이 지적했듯이popen()가장 표준적인 방법이야그리고 어떤 대답도 이 방법을 사용한 예를 제공하지 않았기 때문에, 다음과 같이 한다.

#include <stdio.h>

#define BUFSIZE 128

int parse_output(void) {
    char *cmd = "ls -l";    
    
    char buf[BUFSIZE];
    FILE *fp;

    if ((fp = popen(cmd, "r")) == NULL) {
        printf("Error opening pipe!\n");
        return -1;
    }

    while (fgets(buf, BUFSIZE, fp) != NULL) {
        // Do whatever you want here...
        printf("OUTPUT: %s", buf);
    }

    if (pclose(fp)) {
        printf("Command not found or exited with error status\n");
        return -1;
    }

    return 0;
}

샘플 출력:

OUTPUT: total 16
OUTPUT: -rwxr-xr-x 1 14077 14077 8832 Oct 19 04:32 a.out
OUTPUT: -rw-r--r-- 1 14077 14077 1549 Oct 19 04:32 main.c

Unix-ish 환경의 간단한 문제를 해결하려면 를 사용해 보십시오.

맨 페이지:

popen() 함수는 파이프를 만들고, 포킹하고, 셸을 호출하여 프로세스를 연다.

만약 당신이 읽기 모드를 사용한다면, 이것은 당신이 요구한 것과 똑같다.나는 그것이 윈도우에서 구현되었는지 모르겠다.

더 복잡한 문제에 대해서는 프로세스 간 통신을 찾아보십시오.

popen은 Windows에서 지원되며, 여기를 참조하십시오.

http://msdn.microsoft.com/en-us/library/96ayss4b.aspx

크로스 플랫폼이 되고 싶다면, popen이 가는 길이다.

음, 윈도우 환경에서 명령줄에 있다고 가정하면 파이프나 명령줄 리디렉션을 사용할 수 있다.예를 들어.

commandThatOutputs.exe > someFileToStoreResults.txt

또는

commandThatOutputs.exe | yourProgramToProcessInput.exe

프로그램 내에서 C 표준 입력 기능을 사용하여 다른 프로그램 출력(스캔프 등)을 읽을 수 있다.: http://irc.essex.ac.uk/www.iota-six.co.uk/c/c1_standard_input_and_output.asp. 당신은 또한 파일 예를 사용할 수 있고 fscanf를 사용할 수 있다.이것은유닉스/리눅스에서도 작동해야 한다.

이것은 매우 일반적인 질문으로, 당신은 그것이 어떤 출력 유형인지(단순 텍스트 또는 이진 파일?)와 그것을 어떻게 처리할 것인지와 같은 더 많은 세부사항을 포함하기를 원할 수 있다.

편집: 만세!

STDOUT를 리디렉션하는 것은 귀찮아 보여서, 나는 그것을 에서 해야 했다.NET, 그리고 그것은 나에게 온갖 두통을 일으켰다.적절한 C방법은 아이 낳기, 파일 포인터 받기, 갑자기 머리가 아픈 것 같아.

그래서 임시 파일을 사용하는 해킹을 한다.간단하지만 잘 될 거야.속도가 문제가 되지 않거나(디스크를 느리게 켜는 것이 느리거나) 폐기될 경우 이 기능이 잘 작동한다.엔터프라이즈 프로그램을 구축하는 경우 다른 사람이 추천한 내용을 사용하여 STDOUT 리디렉션을 조사하는 것이 가장 좋을 것이다.

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

int main(int argc, char* argv[])
{
    FILE * fptr;                    // file holder
    char c;                         // char buffer


    system("dir >> temp.txt");      // call dir and put it's contents in a temp using redirects.
    fptr = fopen("temp.txt", "r");  // open said file for reading.
                                    // oh, and check for fptr being NULL.
    while(1){
        c = fgetc(fptr);
        if(c!= EOF)
            printf("%c", c);        // do what you need to.
        else
            break;                  // exit when you hit the end of the file.
    }
    fclose(fptr);                   // don't call this is fptr is NULL.  
    remove("temp.txt");             // clean up

    getchar();                      // stop so I can see if it worked.
}

파일 사용 권한을 확인하십시오. 지금 바로 파일을 exe와 동일한 디렉터리에 저장하십시오.사용 방법을 알아보는 것이 좋을 것이다./tmp nix는 nixo이다.C:\Users\username\Local Settings\Temp비스타에서 또는C:\Documents and Settings\username\Local Settings\Temp in 2K/XP내 생각에/tmpOSX에서 작동하겠지만 난 한 번도 사용해 본 적이 없어

에서는 Linux와 OS XEERGO는popen()dmckee가 지적했듯이, 두 OS 모두 그 통화를 지원하므로, 정말로 최선의 선택이다.Windows(윈도우)의 경우 다음과 같이 하십시오. http://msdn.microsoft.com/en-us/library/ms682499.aspx

MSDN 설명서에 따르면, 만일 Windows 프로그램에 사용된다면, popen 함수는 프로그램이 무한정 응답을 멈추게 하는 유효하지 않은 파일 포인터를 반환한다._팝은 콘솔 애플리케이션에서 제대로 작동한다.입력 및 출력을 리디렉션하는 윈도우즈 응용 프로그램을 만들려면 윈도우즈 SDK에서 리디렉션된 입력 및 출력을 사용하여 하위 프로세스 만들기를 참조하십시오.

사용할 수 있다system()의 경우와 같이:

system("ls song > song.txt");

어디에ls이며, 폴더송의 내용을 나열하는 것은 폴더래래는는는는는는는는는는는는는는는는는는는는는는는는 이다song현재 디렉터리에 있는 폴더. 결과 파일song.txt현재 디렉토리에 작성될 것이다.

//execute external process and read exactly binary or text output
//can read image from Zip file for example
string run(const char* cmd){
    FILE* pipe = popen(cmd, "r");
    if (!pipe) return "ERROR";
    char buffer[262144];
    string data;
    string result;
    int dist=0;
    int size;
    //TIME_START
    while(!feof(pipe)) {
        size=(int)fread(buffer,1,262144, pipe); //cout<<buffer<<" size="<<size<<endl;
        data.resize(data.size()+size);
        memcpy(&data[dist],buffer,size);
        dist+=size;
    }
    //TIME_PRINT_
    pclose(pipe);
    return data;
}

참조URL: https://stackoverflow.com/questions/43116/how-can-i-run-an-external-program-from-c-and-parse-its-output

반응형