我有一个粒子系统程序,它.dat
在每次迭代中生成一个带有粒子坐标的文件。最终目标是通过具有不同参数的脚本多次运行程序。所以,我试图以一种方式设置我的程序,每次运行时,所有相关数据都将存储在一个文件夹中。
我所做的是PNGs
从.dat
文件中生成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 进行了广泛的研究,许多人喜欢SetCurrentDirectory()
Windows,或者他们对使用system()
. 在我的辩护中,我是一个新手程序员,我的知识真的很有限......
现在,当我尝试使用FFMpeg
然后 rar/tar 我的文件制作视频时:
// 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 中得到了非常不同的行为。
赢 7 x64,Visual Studio 2010/12
在 Windows 中,将创建文件夹。这些.dat
文件被正确生成并gnuplot
绘制了PNGs
。当ffmpeg
被调用时,什么也没有发生。没有错误消息FFMpeg
或任何东西。也是如此WinRAR
。也许,对于最后一件事,我可以使用7z
免费的命令行实用程序!
Linux Mint 14 x64,Qt 4.8.1
奇怪的是,这种行为与 Windows 的行为相反。更改目录后,只会.dat
生成第一个文件。就好像我fprintf()
为文件生成所做的每个后续调用都不起作用,或者在某个地方丢失了。和!!Gnuplot
一样有效ffmpeg
tar
我真的很困惑。任何帮助将非常感激。