我有一個粒子系統程序,它在每次迭代中生成一個帶粒子座標的.dat
文件。最終目標是通過具有不同參數的腳本多次運行程序。因此,我試圖以一種方式設置我的程序,對於每次運行,所有相關數據都將存儲在一個文件夾中。不正確地使用系統()調用?
我要做的就是以從.dat
文件PNGs
與Gnuplot
,叫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
作品,如ffmpeg
和tar
!!
我真的很困惑。任何幫助將非常感激。
我認爲只要編寫shell腳本來做這件事會更好。您可能需要爲每個平臺單獨使用一個,但是誰在乎 - 現在獲得的條件編譯相當於相同的東西。 –
謝謝!我真的沉迷於此。但要帶回家的信息是學習如何管理我的錯誤。我必須更好地預測無效的用戶輸入。 – Dima1982