2013-05-27 68 views
0

我有一個粒子系統程序,它在每次迭代中生成一個帶粒子座標的.dat文件。最終目標是通過具有不同參數的腳本多次運行程序。因此,我試圖以一種方式設置我的程序,對於每次運行,所有相關數據都將存儲在一個文件夾中。不正確地使用系統()調用?

我要做的就是以從.dat文件PNGsGnuplot,叫ffmpeg創建一個視頻輸出的PNGs的,使用WinRAR壓縮.dat文件,最後清理,刪除所有的中間文件。這工作,當我在工作目錄中。

現在我嘗試創建一個新的目錄,並在那裏做同樣的事情。我的代碼:

// 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"); 

已經是這部分,我知道會有反對意見。我已經廣泛地觀察了SO,許多人贊成Windows的SetCurrentDirectory(),或者他們對使用system()持懷疑態度。在我的防守,我是新手程序員,我的知識實在有限......

現在,當我試圖讓視頻與FFMpeg,然後RAR /焦油我的文件:

// 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()); 

我得到Win/Linux中非常不同的行爲。

Win 7 x64,Visual Studio 2010/12

在Windows中,該文件夾已創建。 .dat文件生成正確,gnuplot也繪製PNGs。當ffmpeg被調用時,沒有任何反應。沒有從FFMpeg或任何錯誤消息。 WinRAR也是如此。也許,最後一件事,我可以使用免費的7z命令行工具!

Linux Mint的14 64,Qt的4.8.1

奇怪的是,該行爲是由該Windows的反轉。只要第一個.dat文件被更改,就會更改目錄。這就好像我爲我的文件生成對fprintf()所做的每個後續調用都不起作用,或者在某處丟失了。 Gnuplot作品,如ffmpegtar !!

我真的很困惑。任何幫助將非常感激。

+1

我認爲只要編寫shell腳本來做這件事會更好。您可能需要爲每個平臺單獨使用一個,但是誰在乎 - 現在獲得的條件編譯相當於相同的東西。 –

+0

謝謝!我真的沉迷於此。但要帶回家的信息是學習如何管理我的錯誤。我必須更好地預測無效的用戶輸入。 – Dima1982

回答

1

的幾點可能會有所幫助:

  1. 確保檢查每個系統調用,包括系統()和fprintf()的結果。

  2. 自從我上次觸摸Windows以來已經有一段時間了;我記得根據二進制文件的鏈接方式,它們不會總是打印到同一個控制檯。所以ffmpeg/winrar可能會拋出錯誤信息,或者只是分配一個新的,短暫的控制檯來打印。

  3. 我會使用mkdir/_mkdir而不是調用system()。

  4. 通過popen()/ _ popen(),您可以更好地控制錯誤輸出。

  5. 考慮使用shell腳本或bat文件。

+0

我想越容易越好!我會考慮製作一個腳本。我會記住你的有用提示。我需要學習錯誤控制! – Dima1982