2013-05-27 2 views
0

나는 모든 반복에서 입자 좌표로 .dat 파일을 생성하는 입자 시스템 프로그램을 가지고 있습니다. 최종 목표는 다른 매개 변수를 가진 스크립트를 통해 프로그램을 여러 번 실행하는 것입니다. 그래서, 모든 실행에 대해 모든 관련 데이터가 폴더에 저장되는 방식으로 프로그램을 설정하려고합니다.부적절한 system() 호출 사용?

은 내가하는 일은의 PNGs에서 비디오를 만들 ffmpeg를 호출 Gnuplot으로 .dat 파일에서 PNGs을 생성 .dat 파일을 압축하고 마지막으로 모든 중간 파일을 삭제하여, 청소 WinRAR을 사용하는 것입니다. 이것은 작업 디렉토리에서 할 때 작동합니다.

이제 새로운 디렉토리를 만들고 거기에 동일한 작업을 시도합니다. 내 코드 :

// Load the proper library to use chdir() function 
#ifdef _WIN32 
#include <direct.h> 
#elif defined __linux__ || defined __APPLE__&&__MACH__ 
#include <unistd.h> 
#endif 

// Make output directory and change working directory to new directory 
    ostringstream dirCommand; 
    dirCommand << "mkdir " << folderName_str; 
    system(dirCommand.str().c_str()); 
    const char* test = folderName_str.c_str(); 
    #ifdef _WIN32 
     if(_chdir(test)) 
     { 
      printf("Unable to locate the directory: %s\n",test); 
      return; 
     } 
    #elif defined __linux__ || defined __APPLE__&&__MACH__ 
     if(chdir(test)) 
     { 
      printf("Unable to locate the directory: %s\n",test); 
      return; 
     } 
    #endif 
     else 
      printf("Created output directory...\n"); 

이미이 부분에 대해서는 반대 의견이있을 것으로 알고 있습니다. 나는 광범위하게 보았으며 많은 사람들이 Windows 용으로 SetCurrentDirectory()을 선호하거나 그들은 system()을 사용하는 것에 대해 회의적입니다. 내가 할

// Make video 
     std::cout << "Generating Video..." << endl; 
     ostringstream command; 
     command << "ffmpeg -f image2 -r 1/0.1 -i output_%01d.png -vcodec mpeg4 " << videoName_str << ".avi -loglevel quiet"; 
     std::system(command.str().c_str()); 

     // Clean Up! 
     std::cout << "Cleaning up!" << endl; 
     ostringstream command2; 
     #ifdef _WIN32 
      command2 << "rar -inul a " << videoName_str << ".rar *.dat settings.gp loadfile.gp"; 
     #elif defined __linux__ || defined __APPLE__&&__MACH__ 
      command2 << "tar cf " << videoName_str << ".tar *.dat settings.gp loadfile.gp"; 
     #endif 
     std::system(command2.str().c_str()); 

: 나는 FFMpeg와 비디오를 만들려고 할 때 다음 RAR 내 파일 타르/내 방어에서, 지금 ...

나는 초보 프로그래머이고 나의 지식은 정말 제한된다 Win/Linux에서 매우 다른 동작.

윈도우 7 64, 비주얼 스튜디오 창에서 2010/12

는 폴더가 생성됩니다. .dat 파일이 올바르게 생성되고 gnuplotPNGs을 그립니다. ffmpeg이 호출되면 아무 일도 일어나지 않습니다. FFMpeg 또는 기타 오류 메시지가 없습니다. WinRAR도 마찬가지입니다. 어쩌면, 마지막으로, 무료 인 7z의 명령 행 유틸리티를 사용할 수 있습니다!

리눅스 민트 14 64, 이상하게도

Qt는 4.8.1는 동작은 윈도우의 반전된다. 디렉토리가 변경되는 즉시 첫 번째 .dat 파일 만 생성됩니다. 마치 파일 생성을 위해 fprintf()에 대한 모든 후속 호출이 작동하지 않거나 어딘가에서 사라지는 것과 같습니다. Gnuplot 작품과 마찬가지로 ffmpegtar !!

나는 정말로 당혹 스럽다. 도움이된다면 정말 감사하겠습니다. 도움이 될 수

+1

필자는 쉘 스크립트를 작성하는 것이 좋을 것이라고 생각합니다. 각 플랫폼마다 별도의 플랫폼이 필요 하겠지만 누가 신경 써야하는지 - 이제는 동일한 조건으로 컴파일됩니다. –

+0

고마워요! 나는 이것에 정말로 사로 잡혔다. 그러나 집에 가져갈 메시지는 실수를 관리하는 방법을 배우는 것입니다. 나는 잘못된 사용자 입력을 더 잘 예측해야한다. – Dima1982

답변

1

몇 가지 포인트 :

  1. 모든 시스템 호출을 포함하여 시스템()와 fprintf와()의 결과를 확인해야합니다.

  2. 마지막으로 Windows를 접한 지 오래되었습니다. 바이너리가 연결된 방식에 따라 같은 콘솔에 항상 출력되는 것은 아니라는 점을 기억합니다. 따라서 ffmpeg/winrar는 오류 메시지를 버리거나 새롭고 수명이 짧은 콘솔을 할당하여 인쇄 할 수 있습니다.

  3. system()을 호출하는 대신 mkdir/_mkdir을 사용합니다.

  4. popen()/_ popen()을 사용하면 오류 출력을보다 효과적으로 제어 할 수 있습니다.

  5. 셸 스크립트 또는 bat 파일 사용을 고려하십시오.

+0

나는 쉽게 더 나은 것 같아요! 나는 이것에서 스크립트를 만드는 것에 대해 조사 할 것이다. 귀하의 유용한 정보를 염두에 두겠습니다. 나는 오류 제어를 배울 필요가있다 !! – Dima1982

관련 문제