Способ предоставления аргументов для программ, вызываемых в bash - PullRequest
0 голосов
/ 10 февраля 2012

Я пытаюсь запустить .exe из c ++, используя систему. Аргумент, текстовый файл, запрашивается после вызова .exe. Мне нужен способ предоставить этот аргумент.

Чтобы уточнить в bash, я могу сделать это:

cd /programlocation
wine program.exe

Это затем выводит,

Enter input file name :

Если я сейчас наберу

inputfile.txt

Это работает, но я не могу придумать, как объединить этот последний шаг, чтобы я мог запустить его, используя систему из c ++.

т. Это не работает:

std::string location = "cd /location/"
std::string program = "wine program.exe"
std::string input = "inputfile.txt";
std::string command = location+"&&"+program+"&&"+input;
const char *cmd = command.c_str();
system(cmd);

Это просто запрашивает входной файл в консоли.

Если вы можете получить к нему доступ, то программа, которую я пытаюсь запустить, - это файл прогнозирования шума авиационного двигателя ES87 a3011v30.

Ответы [ 3 ]

2 голосов
/ 10 февраля 2012

"inputfile.txt" входит в стандартный ввод wine program.exe;это не команда, которую Bash может понять.

Для передачи в / из внешней программы вы можете вручную fork с pipe s или использовать popen , что было бы ближе к вашему текущему использованию system .

FILE *cmd_stdin = popen(command.c_str(), "w");
fprintf(cmd_stdin, input);
fclose(cmd_stdin);
1 голос
/ 10 февраля 2012

если program.exe читает из стандартного ввода, а не из терминала, то вы можете вызвать систему со строкой:

cd /programlocation && echo inputfile.txt | wine program.exe
0 голосов
/ 10 февраля 2012

Да: использование system (3) будет работать достаточно хорошо большую часть времени.(Это, вероятно, то же самое, что и я, если бы я был в режиме get-'er-done.)

Функция библиотеки system (3) будет передавать строковый аргумент в / bin / sh для интерпретации в большинстве операционных систем.системы.В Linux и Unix это будет работать ... см. Вашу справочную страницу.Исторически люди уклонялись от system () на том основании, что нельзя всегда делать предположения о доступном командном процессоре.Вероятно, не так уж и много беспокойства в наши дни.

Стратегия, которую выдумывают в эскизах, будет более переносимой, поэтому может быть предпочтительнее, если вы собираетесь запускать код в местах, где вы не можете быть уверены, что именновы собираетесь получить с / bin / sh.При таком подходе ваш код берет на себя задачу удобной обработки разветвления и передачи, которую / bin / sh упаковывает.

...