我有一个粒子系统程序,可以在每次迭代中生成一个带有粒子坐标的.dat
文件。最终目标是通过具有不同参数的脚本多次运行程序。因此,我试图以一种方式设置我的程序,对于每次运行,所有相关数据都将存储在一个文件夹中。
我所做的是使用PNGs
从.dat
文件中生成Gnuplot
,致电ffmpeg
以从PNGs
创建视频,使用{ {1}}压缩WinRAR
文件,最后通过删除所有中间文件进行清理。当我在工作目录中这样做时,这是有效的。
现在我尝试创建一个新目录并在那里做同样的事情。我的代码:
.dat
对于这一部分,我知道会有反对意见。我已经广泛了解了SO,许多人赞成// 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()
创建视频,然后rar / tar我的文件时:
FFMpeg
我在Win / Linux中的行为非常不同。
在Windows中,创建文件夹。 // 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());
文件生成正确,.dat
也会生成gnuplot
。调用PNGs
时,没有任何反应。来自ffmpeg
或其他任何内容的错误消息。 FFMpeg
也是如此。也许,最后,我可以使用免费的WinRAR
命令行实用程序!
奇怪的是,这种行为与Windows的行为相反。一旦更改目录,就会生成第一个7z
文件。就好像我为.dat
生成的每个后续调用都没有用,或者在某个地方丢失了。 fprintf()
和Gnuplot
以及ffmpeg
!!
我真的很困惑。任何帮助,都会非常感激。
答案 0 :(得分:1)
可能有用的几点:
确保检查每个系统调用的结果,包括system()和fprintf()。
自从我上次接触Windows以来已经有一段时间了;我记得根据二进制文件的链接方式,它们不会总是打印到同一个控制台。所以ffmpeg / winrar可能会抛出错误信息,或者只是分配一个新的,短命的控制台进行打印。
我会使用mkdir / _mkdir而不是调用system()。
使用popen()/ _ popen(),您可以更好地控制错误输出。
考虑使用shell脚本或bat文件。