Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Си++ для начинающих С.Липпман.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
5.71 Mб
Скачать

7.8.1. Класс для обработки параметров командной строки

Чтобы не перегружать функцию main() деталями, касающимися обработки параметров командной строки, лучше отделить этот фрагмент. Можно написать для этого функцию. Например:

extern int parse_options( int arg_count, char *arg_vector );

int main( int argc, char *argv[] ) {

// ...

int option_status;

option_status = parse_options( argc, argv );

// ...


}

Как вернуть несколько значений? Обычно для этого используются глобальные объекты, которые не передаются ни в функцию для их обработки, ни обратно. Альтернативной стратегией является инкапсуляция обработки параметров командной строки в класс.

Данные-члены класса представляют собой параметры, заданные пользователем в командной строке. Набор открытых встроенных функций-членов позволяет получать их значения. Конструктор инициализирует параметры значениями по умолчанию. Функция-член получает argc и argv в качестве аргументов и обрабатывает их:

#include <vector>

#include <string>

class CommandOpt {

public:

CommandOpt() : _limit( -1 ), _debug_on( false ) {}

int parse_options( int argc, char *argv[] );

string out_file() { return _out_file; }

bool debug_on() { return _debug_on; }

int files() { return _file_names.size(); }

string& operator[]( int ix );

private:

inline void usage( int exit_value = 0 );

bool _debug_on;

int _limit;

string _out_file;

vector<string> _file_names;

static const char *const program_name;

static const char *const program_version;


};

Так выглядит модифицированная функция main():18

#include "CommandOpt.h"

int main( int argc, char "argv[] ) {

// ...

CommandOpt com_opt;

int option_status;

opttion_status = com_opt. parse_options (argc, argv);

// ...


}

Упражнение 7.15

Добавьте обработку опций -t (включение таймера) и -b (задание размера буфера bufsize). Не забудьте обновить usage(). Например:

prog -t -b 512 dataO

Упражнение 7.16

Наша реализация не обрабатывает случая, когда между опцией и ассоциированным с ней значением нет пробела. Модифицируйте программу для поддержки такой обработки.

Упражнение 7.17

Наша реализация не может различить лишний пробел между дефисом и опцией:

prog - d dataO

Модифицируйте программу так, чтобы она распознавала подобную ошибку и сообщала о ней.

Упражнение 7.18

В нашей программе не предусмотрен случай, когда опции -l или -o задаются несколько раз. Реализуйте такую возможность. Какова должна быть стратегия при разрешении конфликта?

Упражнение 7.19

В нашей реализации задание неизвестной опции приводит к фатальной ошибке. Как вы думаете, это оправдано? Предложите другое поведение.

Упражнение 7.20

Добавьте поддержку опций, начинающихся со знака плюс (+), обеспечив обработку +s и +pt, а также +sp и +ps. Предположим, что +s включает строгую проверку синтаксиса, а +p допускает использование устаревших конструкций. Например:

prog +s +p -d -b 1024 dataO