Я использую gnuplot_i.hpp построить много данных из программы на C ++. Мне нужно иметь возможность поместить выходные файлы (PNG изображения) в другие папки. Но когда я пытаюсь установить вывод для других папок, с относительными или абсолютными адресами, это терпит неудачу. Gnuplot дает мне сообщение «не могу открыть файл, вывод не изменен». Я могу положить файл в текущий каталог.
Я не знаю, является ли это чем-то глупым, например, проблемой с именем файла, или чем-то менее интуитивным, например проблемой с разрешениями. Но я заметил, что моя программа «заканчивается» до того, как gnuplot завершает работу. Я не знаю, связано ли это с ошибками, но, возможно, я бы хотел, чтобы gnuplot завершил задание A, прежде чем дать ему задание B.
Вот пример кода:
#include <iostream>
#include <string>
#include "../gnuplot_i.hpp"
int main(){
Gnuplot g("null");
std::cout << "Test Start" << std::endl;
// Put file in current directory...
std::string current_dir_string = "set terminal pngcairo enhanced\r\n""set output \"test1.png\"\r\n""$DATA << EOD\r\n""1 1\r\n""2 2\r\n""3 3\r\n""EOD\r\n""plot $DATA with linespoints\r\n";
// Put file in test directory with absolute address...
std::string test_dir_string1 = "set terminal pngcairo enhanced\r\n""set output \"C:\\Users\\REDACTED\\Documents\\PROGRAMMING\\Test\\testdir\\test2.png\"\r\n""$DATA << EOD\r\n""1 1\r\n""2 2\r\n""3 3\r\n""EOD\r\n""plot $DATA with linespoints\r\n";
// Put file in test directory with relative address...
std::string test_dir_string2 = "set terminal pngcairo enhanced\r\n""set output \".\\testdir\\test3.png\"\r\n" // ADDED THE . ACCORDING TO SoronelHaetir'S COMMENT, BUT DIDN'T UPDATE OUTPUT IMAGE.
"$DATA << EOD\r\n""1 1\r\n""2 2\r\n""3 3\r\n""EOD\r\n""plot $DATA with linespoints\r\n";
// Put file in test directory with number in name...
g.cmd(current_dir_string); // THIS WORKS
g.cmd(test_dir_string1); // THIS FAILS
g.cmd(test_dir_string2); // THIS FAILSstd::cout <<std::endl;
std::cout << "Test Finished" << std::endl;
return 0;
}
И вот вывод:
Я наткнулся на решение, немного поиграв с самим приложением gnuplot. gnuplot_i.hpp создает процесс gnuplot и отправляет весь текст процессу для печати. Но gnuplot нужно экранировать символы \ как "\\"
, Я думал, что делал это в моем коде выше, но gnuplot_i.hpp, должно быть, убрал экранирующие символы, чтобы gnuplot получил только 1. Это заставило gnuplot интерпретировать имена файлов как неправильные коды escape-символов. После изменения моего кода на использование 4 \ символов он, похоже, работает, потому что 2 \ передается в gnuplot и имя файла интерпретируется правильно.
Других решений пока нет …