std :: system не выполняет мою команду - PullRequest
1 голос
/ 11 апреля 2020

Я довольно неопытен в C ++ и пытаюсь настроить программу, которая создает файл данных, скрипт gnuplot, который строит файл данных, а затем запускает gnuscript. Программа, которую я настроил, создает сценарий datafile и 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, похоже, не запускается?

EDIT: Если я изменю каталог для поиска с помощью 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, так что это не должно иметь никакого эффекта.

1 Ответ

0 голосов
/ 11 апреля 2020

Информация слишком мала, я не могу указать, что не так с вашим кодом.

Но я думаю, что вы можете запустить system("dir"), чтобы проверить правильность вашего рабочего каталога.

Вы знаете, если вы запустите / отладите программу в IDE, рабочий каталог может не соответствовать вашим ожиданиям.

...