Урок 110. Аргументы командной строки

   ⁄ 

 Обновлено 25 Янв 2018  ⁄ 

⁄   355

В уроке о введении в разработку программных продуктов мы узнали, что при компиляции и линкинге, компилятор создает исполняемый файл. Когда программа запускается, выполнение начинается из первой строки функции main(). До этого урока мы объявляли main() следующим образом:

Обратите внимание, в этой версии main() параметров никаких нет. Тем не менее, многие программы нуждаются в некоторых входных данных. Например, предположим, что вы пишете программу под названием Picture, которая принимает изображение в качестве входных данных, а затем делает из этого изображения миниатюру (уменьшенная версия изображения). Как функция Picture узнает какое изображение нужно принимать и обрабатывать? Пользователь должен сообщить программе, какой файл открыть. Это можно сделать так:

Тем не менее, здесь есть потенциальная проблема. Каждый раз, при запуске, программа будет ожидать пользовательский ввод. Это не проблема, если вы вручную запускаете программу из командной строки один раз для одного изображения. Но это уже проблема, если вы хотите работать с большим количеством файлов или чтобы другая программа имела возможность запустить эту программу.

Рассмотрим эти случаи подробнее.

Например, вы хотите создать миниатюры для всех файлов-изображений, которые находятся в определенном каталоге файлов. Как это сделать? Вы можете запускать эту программу столько раз, сколько есть изображений в каталоге, введя каждое имя файла вручную. Однако, если есть сотни изображений, то такой подход будет, мягко говоря, не очень эффективен! Решением здесь будет написать программу, которая перебирала бы каждое имя файла в каталоге, вызывая каждый раз Picture для каждого файла.

Теперь рассмотрим случай, когда у вас есть веб-сайт, и вы хотите, чтобы он создавал миниатюру каждый раз, когда пользователь загружает изображение на сайт. Эта программа не может принимать входные данные из Интернета и следует логический вопрос: «Как тогда вводить имя файла?». Выход — вызов веб-сервером функции Picture автоматически каждый раз после загрузки файла.

В обоих этих ситуациях нам нужно, чтобы внешняя программа передавала имя файла в качестве входных данных в нашу программу при её запуске, вместо того, чтобы Picture сам дожидался, пока пользователь вручную введет имя файла.

Аргументы командной строки — это необязательные строковые аргументы, передаваемые операционной системой в программу при её запуске. Программа может их использовать в качестве входных данных, либо проигнорировать. Подобно тому, как параметры одной функции предоставляют данные для параметров другой функции, так и аргументы командной строки предоставляют возможность людям или программам предоставлять входные данные для программы.

Передача аргументов командной строки

Исполняемые программы могут запускаться в командной строке через вызов. Например, для запуска исполняемого файла MyProgram, который находится в корневом каталоге диска C в ОС Windows вам нужно будет ввести:

C:\>MyProgram

Чтобы передать аргументы командной строки в MyProgram, вам нужно будет их просто перечислить после имени исполняемого файла:

C:\>MyProgram SomeContent.txt

Теперь, при запуске MyProgram, SomeContent.txt будет предоставлен в качестве аргумента командной строки. Программа может иметь несколько аргументов командной строки, разделяются они пробелами:

C:\>MyProgram SomeContent.txt SomeOtherContent.txt

Это также работает и с другими операционными системами, например, с Linux (хотя структура каталогов будет отличаться от структуры каталогов в Windows).

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

В Microsoft Visual Studio это делается так: щелкните правой кнопкой мыши на нужный проект в Обозревателе Решений, затем выберите «Свойства». Далее «Свойства конфигурации» и затем «Отладка». На правой панели будет строка «Аргументы команды». Вы сможете там ввести аргументы командной строки, и они будут автоматически переданы вашей программе при её запуске.

В Code::Blocks нужно будет выбрать «Project > Set program`s arguments».

Использование аргументов командной строки

Теперь, когда вы знаете, как предоставить аргументы командной строки в программу, следующим шагом будет доступ к ним из программы. Для этого используется уже другая форма main(). Эта новая форма main() принимает два аргумента (argc и argv) следующим образом:

Также вы можете увидеть и такой вариант:

Хоть оба эти варианта идентичны по своей сути, но мы рекомендуем использовать первый, так как он более интуитивно понятен.

argc — это целочисленный параметр, содержащий количество аргументов, переданных в программу (argc = argument count – количество аргументов). argc всегда будет как минимум 1, так как первым аргументом всегда является имя самой программы. Каждый аргумент командной строки, который предоставляет пользователь, заставит argc увеличиться на 1.

argv — это место, где хранятся фактические значения аргументов (argv = argument values — значения аргументов; хотя изначально было “argument vectors”). Хотя объявление argv выглядит немного пугающе, но это всего лишь массив строк C-style. Длина этого массива — argc.

Давайте напишем короткую программу MyArguments, которая будет выводить значения всех аргументов командной строки:

Теперь, при вызове MyArguments с аргументами командной строки «SomeContent.txt» и «200», вывод будет следующим:

There are 3 arguments:
0 C:\MyArguments
1 SomeContent.txt
2 200

Параметр 0 — это путь и имя текущей программы. Параметры 1 и 2 здесь являются аргументами командной строки, которые мы передали.

Обработка числовых аргументов

Аргументы командной строки всегда передаются в качестве строк, даже если предоставленное значение является числовым. Чтобы использовать аргумент командной строки в виде числа, вам нужно будет преобразовать его из строки в число. К сожалению, в C++ это делается немного сложнее, чем оно должно быть:

Если мы запустим эту программу с аргументом командной строки «843», то результатом будет:

Got integer: 843

std::stringstream работает почти так же, как и std::cin. Здесь мы инициализируем переменную std::stringstream значением argv[1], так что мы можем использовать оператор >> для извлечения значения в переменную int.

Мы поговорим подробнее о std::stringstream в следующей главе.

Сначала ОС анализирует аргументы командной строки

Когда вы вводите что-то в командной строке (или запускаете свою программу из среды IDE), то операционная система ответственна за то, чтобы ваш запрос проделал правильный путь. Это связано не только с запуском исполняемого файла, но и с анализом любых аргументов для определения того, как их следует обрабатывать и передавать в приложение.

Операционные системы имеют специальные правила обработки спец. символов (двойные кавычки, бэкслешы и т.д.).

Например:

MyArguments Hello world!

Результат:

There are 3 arguments:
0 C:\MyArguments
1 Hello
2 world!

Строки, переданные в двойных кавычках, считаются частью одной и той же строки:

MyArguments "Hello world!"

Результат:

There are 2 arguments:
0 C:\MyArguments
1 Hello world!

Чтобы вывести каждое слово отдельно на строке – используйте бэкслешы:

MyArguments \"Hello world!\"

Результат:

There are 3 arguments:
0 C:\MyArguments
1 "Hello
2 world!"

Итого

Аргументы командной строки предоставляют отличный способ для пользователей или других программ передавать входные данные в программу при её запуске. Используйте любые входные данные, необходимые программе при запуске, в качестве аргументов командной строки. Если командная строка не передана, то вы всегда можете это обнаружить и попросить пользователя ввести данные вручную. Таким образом, ваша программа будет работать в любом случае.

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (5 оценок, среднее: 5,00 из 5)
Загрузка...
Подписаться на обновления:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *