ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 12) онлайн

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

Если вы использовали когда-нибудь старый добрый MS DOS, вам должно быть знакомо понятие аргументов командной строки, использующихся при запуске программ. Их типичное применение — передача имени файла с данными в при- ложение. Например, вы запускаете программу редактирования текстов и хотите сразу открыть документ, с которым будете работать. Для этого вы пишете:

C:\>wordproc afile.doc

 

Здесь аргументом командной строки является afile.doc. Нам надо каким-то образом заставить программу на C++ распознавать такие обращения. Следу- ющая программа, приводимая в качестве примера, считывает и выводит на эк- ран столько аргументов командной строки, сколько вы сможете напечатать (они отделяются пробелами).

Листинг 12.21. Программа COMLINE

// comline.cpp

// Демонстрация работы с аргументами командной строки

#include <iostream>

using namespace std;

 

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

{

  cout << "\nargc = " << argc << endl; // число аргументов

 

  for(int j=0; j<argc; j++)            // вывести аргументы

    cout << "Аргумент " << j << " = " << argv[j] << endl;

  return 0;

}

 

А вот пример работы этой программы:

 

C:\C++BOOK\Chap12>comline uno dos tres

argc = 4

Аргумент 0 = C:\C++BOOK\CHAP12>COMLINE.exe

Аргумент 1 = uno

Аргумент 2 = dos

Аргумент 3 = tres

 

Для того чтобы программа смогла прочитать аргументы, функции main() (не забываем, что это тоже функция!) должны быть самой переданы два аргумента. Первый, argc (счетчик аргументов), представляет собой число параметров, пере- данных из командной строки в программу. Первый параметр — это всегда пол- ный путь к данной программе. Остальные уже зависят от того, что ввел пользо- ватель. Друг от друга аргументы отделяются пробелом. В приведенном примере аргументами командной строки были uno, dos, tres.

Система хранит переданные ей параметры как строки в памяти. Создает мас- сив указателей на эти строки. В нашем примере этим массивом был argv. Каж- дая отдельная строчка доступна с помощью соответствующего указателя, поэто- му первым аргументом (путем к программе) является argv[0], вторым — argv[1] и т. д, COMLINE обращается по очереди к аргументам и выводит их на экран с по- мощью цикла for, использующего в качестве ограничителя параметр argc (число переданных в программу аргументов).

Нет особой нужды использовать только имена argv и argc в качестве парамет- ров main(), но они настолько привычны, что другие названия вызовут у всех, кроме невозмутимого компилятора, повышенное напряжение мозговой деятель- ности в попытках понять, чего хотел программист.

Приводимая ниже программа использует аргумент командной строки для че- го-то действительно полезного. Она выводит на экран содержимое текстового файла, имя которого пользователь ввел в командной строке. Таким образом, она имитирует команду TYPE MS DOS.

Листинг 12.22. Программа OTYPE

// otype.cpp

// Имитация команды TYPE

#include  <fstream>      // для файловых функций

#include  <iostream>

Листинг 12.22 (продолжение)

using namespace std;

#include <process.h>      // для exit()

 

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

{

  if( argc != 2 )

    {

    cerr << "\nФормат команды: otype имя_файла";

    exit(-1);

    }

  char ch;                // символ для считывания

  ifstream infile;        // создать входной файл

  infile.open( argv[1] ); // открыть файл

  if( !infile )           // проверить на наличие ошибок

    {

    cerr << "\nНевозможно открыть " << argv[1];

    exit(-1);

    }

  while( infile.get(ch) != 0 ) // считать символ

    cout << ch;                // отобразить символ

  return 0;

}

 

Программа вначале проверяет, правильное ли количество аргументов ввел пользователь. Надо при этом помнить, что путь к файлу OTYPE.EXE всегда будет первым аргументом. Вторым — путь к файлу, который пользователь собирается открыть.

C:\>otype ichar.cpp

Таким образом, всего аргументов должно быть ровно два. Если это не так, вероятно, пользователь еще не понял, как работать с нашей великой програм- мой. Чтобы прояснить для него ситуацию, на экран выводится специальное со- общение с помощью cerr.

Если количество аргументов сошлось с требуемым, программа начинает пы- таться открыть указанный файл (argv[1]). Опять же, если с этим возникли какие- то проблемы, программа выводит соответствующее сообщение. Наконец, после корректного открытия, в цикле while считывается символ за символом весь файл и выводится на экран.

Нулевое значение символа говорит о том, что достигнут конец файла. Это — еще один способ распознавания EOF. Так же можно использовать значение само- го файлового объекта, как мы делали ранее:

while( infile )   {

  infile.get(ch);

  cout << ch;   }

А вы знаете, что весь этот цикл while можно заменить одним-единственным выражением?

cout << infile.rdbuf();

Между тем такой способ мы уже видели в программе ICHAR2.

 

44