【问题标题】:std::system doesn't seem to be running my commandstd::system 似乎没有运行我的命令
【发布时间】:2020-07-24 01:14:56
【问题描述】:

我对 C++ 非常缺乏经验,我正在尝试设置一个程序来创建一个数据文件,一个绘制数据文件的 gnuplot 脚本,然后运行 ​​gnuscript。我设置的程序按预期创建数据文件和 gnuplot 脚本,但是当尝试使用 std::system 运行脚本时,我实际上没有得到任何输出:

    std::string sysGnuCommand = "gnuplot output/data/_data.gnu";
    int errorGnuSys = std::system(sysGnuCommand.c_str());
    if (errorGnuSys == -1) std::cout << "[ERROR]: Couldn't execute GnuPlot.\n";

像这样运行程序,数据文件和 gnuplot 脚本按预期创建,但 gnuscript 没有运行,系统函数也没有返回错误。当我改为运行程序,然后在控制台中手动运行gnuplot output/data/_data.gnu 时,我得到了我期望的确切输出。 std::system 命令怎么好像没有运行?

编辑:如果我将要使用 gnuplot 搜索的目录更改为不正确的目录,则 gnuplot 会正确返回错误。但是,通过在 gnuplot 脚本中添加带有控制台输出的行,我发现在程序中调用 std::system 时实际上并没有运行 _data.gnu。我已经检查以确保 std::system 在预期的目录中工作,所以问题似乎确实存在于某个地方。

编辑 2:

int main(){
    FileSystem _fileManager;

    std::string _outDir = "output/data/";

    create_folder_path(_outDir + "/plots");

    _fileManager.set_directory(_outDir);

    std::string currentName;
    currentName = "_data";

    std::string _csvOutput;
    _csvOutput = currentName + ".csv";
    _fileManager.create_file(_csvOutput);

    std::string _gnuScriptOutput;
    _gnuScriptOutput = currentName + ".gnu";
    _fileManager.create_file(_gnuScriptOutput);


    std::string _gnuText = 
        "system \"dir\"\n"
        "set terminal postscript enhanced color eps\n"
        "set cbrange [0:25]\n"
        "set output \"" + _outDir + "plots/" + currentName + ".ps\"\n"
        "plot \"" + _outDir + _csvOutput + "\" using 1:2:3 notitle with image";
    _fileManager.add_line(_gnuScriptOutput, _gnuText);

    for(int x = 1; x <= 5; ++x){
        for(int y = 1; y <= 5; ++y){
            std::vector<double> outputLine;
            outputLine.push_back(x);
            outputLine.push_back(y);
            outputLine.push_back(x*y);
            _fileManager.add_line(_csvOutput, outputLine);
            outputLine.clear();
        }
    }

    std::string sysGnuCommand = "gnuplot " + _outDir + _gnuScriptOutput;
    int errorGnuSys = std::system(sysGnuCommand.c_str());
    if (errorGnuSys != 0) std::cout << "[ERROR]: Couldn't execute GnuPlot.\n";
}

这是我的main 函数的代码。 FileSystem 只是一个简化数据处理的类,并且完全按预期工作 - 我相信它不是问题的根源。我也没有在 IDE 中工作,所以应该不会有任何影响。

【问题讨论】:

  • errorGnuSys 的实际值是多少? -1 通常不是它会返回的错误,所以你的错误检查永远不会像这样触发。
  • 我查了一下,errorGnuSys 是 0。
  • 我会在strace -f 下运行它,看看会发生什么。
  • 我将如何使用strace -fproperly?我不熟悉它。

标签: c++ gnuplot std


【解决方案1】:

信息太少,我无法指出你的代码有什么问题。

但我认为您可以运行system("dir") 来检查您的工作目录是否正确。

你知道,如果你在 IDE 中运行/调试程序,工作目录可能不符合你的期望。

【讨论】:

  • system("dir") 告诉我我正在使用比/output/ 目录高一级的目录,这是我运行程序的同一个目录。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-17
  • 2023-02-13
  • 1970-01-01
  • 2015-09-22
  • 2021-11-27
  • 1970-01-01
  • 2022-12-04
相关资源
最近更新 更多