Как передать параметры с пробелами через систему cstdlib

84
7

У меня есть это консольное приложение для Windows, которое берет файл, выполняет некоторые вычисления и затем записывает вывод в указанный файл. Ввод указан в формате "app.exe -input fullfilename". Мне нужно вызвать это приложение из моей программы на С++, но у меня есть проблема с пробелами в пути к файлам. Когда я вызываю приложение непосредственно из cmd.exe, набрав (без указания выходного файла для ясности)


"c:\first path\app.exe" -input "c:\second path\input.file"

все работает так, как ожидалось. Но, когда я пытаюсь использовать функцию cstdlib std:: system(), i.e.


std::system(" \"c:\\first path\\app.exe\" -input \"c:\\second path\\input.file\" ");

консоль печатает, что c:\first не является допустимой командой. Это, вероятно, распространенная ошибка и имеет простое решение, но я не смог ее найти. спасибо для любой помощи.

спросил(а) 2010-06-08T16:00:00+04:00 9 лет, 8 месяцев назад
1
Решение
50

Вместо std:: system() вы должны использовать функцию _wspawnv из Windows API. Используйте _wspawnvp, если вы хотите искать программу в PATH, а не указывать полный путь к ней.



#include <stdio.h>
#include <wchar.h>
...
const WCHAR *app = L"C:\\path to\\first app.exe";
const WCHAR *argv[] = {app, L"-input", L"c:\\second path\\input file.txt"};
_wpspawnv(_P_WAIT, app, argv);

Вы также можете использовать _spawnv/_spawnvp, если вы на 100% уверены, что ваше имя входного файла никогда не будет содержать ничего, кроме ASCII.

ответил(а) 2010-06-09T23:19:00+04:00 9 лет, 8 месяцев назад
35

Не пытайтесь помещать кавычки в вызов std:: system(). Попробуйте следующее:

std::system("c:\\first\\ path\\app.exe -input c:\\second\\ path\\input.file");

ответил(а) 2010-06-08T16:12:00+04:00 9 лет, 8 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема