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
내 생각에/tmp
OSX에서 작동하겠지만 난 한 번도 사용해 본 적이 없어
에서는 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;
}
'IT이야기' 카테고리의 다른 글
@OneToMulti와 @ElementCollection의 차이점? (0) | 2022.05.20 |
---|---|
반복하는 동안 해시맵에서 키를 제거하는 방법 (0) | 2022.05.20 |
v-if, v-else, v-else-if에서 동일한 구성 요소 태그가 Vue 인스턴스를 공유하지 못하도록 방지 (0) | 2022.05.20 |
C에서 함수를 호출하기 전의 파라미터 평가 순서 (0) | 2022.05.20 |
SSE/AVX와 함께 FMA(Fused Multiple-Add) 지침을 사용하는 방법 (0) | 2022.05.20 |