2011-01-20 3 views
0

저는 C++에서 다른 프로그램을 호출하고 텍스트 파일에 그 프로그램의 stout을 저장하려고했습니다. popen()이 적절한 함수 인 것처럼 보이지만 텍스트 파일에 저장하는 것은 작동하지 않습니다.파일에 popen() 출력을 작성하십시오.

 ofstream delaunayfile; 
    delaunayfile.open ("triangulation/delaunayedpoints.txt"); 
     FILE *fp; 
     fp = popen("qdelaunay < triangulation/rawpoints.txt", "r"); 
    delaunayfile << fp; 
    delaunayfile.close(); 

도움이 필요하십니까? 미리 감사드립니다!

답변

0

는이 작업을 수행하는 두 가지 방법이 있습니다 : 간단한 방법

int rc = system("qdelaunay <triangulation/rawpoints.txt>triangulation/delaunayedpoints.txt"); 

과 약간 더 정교한 방법, 포크(), dup2에()과는 execve(), 설치 쉘 인터프리터없이 후자의 작업을 사용하여 시스템에. 이 작업이 계산 작업을 수행하는 것처럼 보이면 임베디드 시스템이 아닌 것으로 판단됩니다. 따라서 작업 쉘을 사용할 수 있습니다.

0

popen은 파이프를 열지 만, 당신은 그런 식으로 delaunayfile에 스트림을 보낼 수 있다는 것을 모릅니다.

물론 그렇게 할 수 있다면 파이프가 완료 될 때까지 파이프에서 읽는 것이 좋습니다.

파이프에서 데이터를 확인하는 일반적인 방법은 select()를 사용하는 것입니다. 유용한 링크 인 http://codenewbie.com/forums/threads/2908-Using-std-fstream-in-a-pipe이 fstream과 파이프를 통합하여 원하는 것을 얻을 수 있다는 것을 알았습니다.

이 예에서는 파일에 출력을 쓰고 싶지만 파이프 출력이 아닌 파이프 출력으로 리디렉션하는 것이 좋을까요? 파이프의 목적은 프로세스 간 (Inter-Process) 통신이지만 실제적인 목적으로 다른 프로세스에서받은 데이터를 사용하는 것으로 보이지는 않습니다.

2

FILE*을 스트림에 직접 쓸 수 없습니다. 실제 파일 내용 대신 메모리 주소를 작성하므로 원하는 결과를 얻을 수 없습니다.

이상적인 솔루션은 ifstream에서 읽고 ofstream에 기록하는 것입니다,하지만 FILE*에서 ifstream를 구성 할 수있는 방법이 없습니다.

그러나 streambuf 클래스를 확장하여 FILE*에서 작동하도록 만든 다음 istream으로 전달할 수 있습니다. 빠른 검색을 통해 누군가 이미이를 구현했으며, 적절하게 이름이 popen_streambuf 인 것으로 나타났습니다. this specific answer을 참조하십시오.

귀하의 코드는 다음과 같을 것이다 :

의견 Simon Richter에 의해 지적
std::ofstream output("triangulation/delaunayedpoints.txt"); 
popen_streambuf popen_buf; 
if (popen_buf.open("qdelaunay < triangulation/rawpoints.txt", "r") == NULL) { 
    std::cerr << "Failed to popen." << std::endl; 
    return; 
} 
char buffer[256]; 
std::istream input(&popen_buf); 
while (input.read(buffer, 256)) { 
    output << buffer; 
} 
output.close(); 

streambuf를 받아 EOF에 도달 할 때까지 ostream에 데이터를 쓰는 operator<<있다. 귀하의 예제에서, 당신은 또한`출력 << & popen_buf를 사용할 수

std::ofstream output("triangulation/delaunayedpoints.txt"); 
popen_streambuf popen_buf; 
if (popen_buf.open("qdelaunay < triangulation/rawpoints.txt", "r") == NULL) { 
    std::cerr << "Failed to popen." << std::endl; 
    return; 
} 
output << &popen_buf; 
output.close(); 
+1

노트,''연산자 << (표준이 있기 때문에, 데이터를 복사 : : :이 방법은 코드를 단순화 할 것 ostream &, std :: streambuf *);'. –

+0

@ 사이먼 리히터 : 오, 나는 완전히 그것을 놓쳤다! 귀하의 제안을 언급하도록 업데이트되었습니다. 고맙습니다! – jweyrich

관련 문제