0

我有一个粒子系统程序,它.dat在每次迭代中生成一个带有粒子坐标的文件。最终目标是通过具有不同参数的脚本多次运行程序。所以,我试图以一种方式设置我的程序,每次运行时,所有相关数据都将存储在一个文件夹中。

我所做的是PNGs.dat文件中生成Gnuplot,调用ffmpeg从 中创建视频PNGsWinRAR用于压缩.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一样有效ffmpegtar

我真的很困惑。任何帮助将非常感激。

4

1 回答 1

1

可能有帮助的几点:

  1. 确保检查每个系统调用的结果,包括 system() 和 fprintf()。

  2. 我上次接触 Windows 已经有一段时间了。我记得根据二进制文件的链接方式,它们并不总是打印到同一个控制台。所以 ffmpeg/winrar 可能会丢弃错误消息,或者只是分配一个新的、短命的控制台来打印。

  3. 我会使用 mkdir/_mkdir 而不是调用 system()。

  4. 使用 popen()/_popen() 您可以更好地控制错误输出。

  5. 考虑使用 shell 脚本或 bat 文件。

于 2013-05-27T23:39:08.210 回答