Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Русские символы в качестве аргумента system()


Автор: rudolfninja 16.5.2015, 15:57
Привет всем.
Ребят, помогите решить такую проблему. Мне надо из приложения запустить функцию system(), аргументами которой будет путь к файлу, содержащему русские символы. С версией system() это не работает.
Если передаю аргументы только с англ. строкой, то все ок. Если в имени файла встречается русский символ, то system его не может нормально обработать. Не подскажете, как можно решить эту проблему?
Вообще, задача такова: рядом с моим исполняемым файлом есть исполняемый файл, например, test.exe. Мне надо с моего приложения вызвать test.exe c аргументом, указывающим на файл. Как это можно еще сделать если не через system()?

Спасибо.

Автор: Cheloveck 16.5.2015, 16:27
Использование system -- не лучшая практика.

Windows: https://msdn.microsoft.com/en-us/library/windows/desktop/ms682425%28v=vs.85%29.aspx
UNIX: http://pubs.opengroup.org/onlinepubs/7908799/xsh/fork.html + http://pubs.opengroup.org/onlinepubs/009695399/functions/exec.html
Если исользуешь какие-нибудь тулкиты, типа boost, Qt или GTK+, то там есть свои кроссплатформенные функции.

Автор: rudolfninja 16.5.2015, 16:34
Цитата(Cheloveck @  16.5.2015,  16:27 Найти цитируемый пост)
Если исользуешь какие-нибудь тулкиты, типа boost, Qt или GTK+, то там есть свои кроссплатформенные функции

Как раз Qt и использую.
Не подскажете, как в нем можно своими средствами выполнить мою задачу?
Спасибо.

Автор: Cheloveck 16.5.2015, 16:45
http://doc.qt.io/qt-5/qprocess.html#details

Автор: rudolfninja 16.5.2015, 17:08
Что-то не срабатывает QProcess
Через system делаю так:
Код

QString cmd = exe_file_path + "/abiword/abiword --to=txt -o " + temp_file + " " + fileName;
system(cmd.toStdString.c_str());


Через QProcess:
Код

QProcess abiword;
QStringList arguments;
arguments << "--to=txt" << "-o" << temp_file << fileName;
abiword.start(exe_file_path + "/abiword/abiword", arguments);
if(!abiword.waitForStarted())
            qDebug() << "not started";
        else
            qDebug() << "started";
        abiword.waitForFinished();

Процесс запускается, вот аргументы, вроде как, не передаются в него, т.к. нужного файла не появляется.

Автор: feodorv 16.5.2015, 19:40
Создайте программу, которая просто печатает передаваемые ей аргументы, байт в байт. Подсуньте её вместо своей программы. Посмотрите на вывод. Скорее всего, дело в кодировках.

Добавлено через 55 секунд
Или в пробелах в именах файлов/директорий...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)