Программирование >>  Дополнительные возможности наследования 

1 ... 171 172 173 [ 174 ] 175 176 177 ... 265


22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58

if (argc != 2) {

cout Usage: argv[0] <filename> endl; return(l);

ofstream fout(argv[1],ios::binary);

if (!fout)

cout << Unable to open << argv[1] << for writingA n return(l);

Animal Bear(50,100); fout.write((char*) &Bear,sizeof Bear);

tout.close();

ifstream fin(argv[1],ios::binary);

If (!fin)

cout Unable to open argv[1] for reading.\ n return(l);

Animal BearTwo(1,1);

cout BearTwo weight: << BearTwo.GetWeight() << endl; cout BearTwo days: BearTwo.GetDaysAlive() endl;

fin.read((char*) &BearTwo, sizeof BearTwo):

cout BearTwo weight: BearTwo.GetWeight() endl; cout BearTwo days: BearTwo,GetDaysAlive() endl; fin.closeO; return 0;

BearTwo weight: 1 BearTwo days: 1 BearTwo weight: 50 BearTwo days: 100

Объявление класса Animal аналогично представленному в листинге 16.18.

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



в строках 22-26 проверяется, соответствует ли установленное число аргументов ожидаемому. Если пользователь забыл ввести имя файла, то вьшодится сообщение об ошибке:

Usage TestProgram <имяфайла>

После этого профамма завершает свою работу. Обратите внимание, что при выводе имени профаммы использется не констатная строка, а значение argv[0] . Данное выражение будет правильно выводить имя профаммы, даже если оно будет изменено после компиляции.

В строке 28 профамма пытается открыть двоичный файл с указанным именем. Однако, вместо того чтобы копировать и хранить имя файла во временном массиве, как это было в листинге 16.18, его можно задать в командной строке и затем возвратить из argv[1 ].

Точно так же имя файла возвращается в строке 40, где этот файл открьшается для ввода данных, и в строках 25 и 31 при формировании сообщений об ошибках открьтш файлов.

Резюме

Сегодня вы познакомились с потоками и глобальными объектами cout и cin. Основное предназначение объектов istream и ostream состоит в инкапсулировании буфе-ризированого ввода и вывода данных на стандартные устройства ввода-вывода.

В каждой профамме создается четыре стандартных потоковых объекта: cout, cin, cerr и clog. Однако в большинстве опера1щонных систем эти объекты можно переадресовьгаать.

Объект cin класса istream используется для ввода данных обычно вместе с пере-фужаемым оператором ввода ( ). Объект cout класса ostream используется для вывода данных в комбинации с оператором вывода ( ).

Стандартные объекты ввода-вывода включают много других функций-членов, например get О и put(). Поскольку эти методы возвращают ссылки на объект потока, несколько вызовов функций можно объединять в одном выражении.

Для настройки работы объектов потока используются манипуляторы. С их помошью можно устанавливать не только опции форматирования и отображения, но и многие другие атрибуты объектов потока.

Обмен данными с файлами осуществляется с помощью классов fstream, производных от класса iostream. Кроме обычных операторов ввода и вывода, эти классы поддерживают использование функций read О и write(), позволяющих считывать и записывать целые объекты в двоичные файлы-

Вопросы U ответы

Как определить, когда использовать операторы ввода и вьшода, а когда другае функции-члены классов потока?

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

Какое отличие между cerr и clog?

Объект cerr не буферизируется? Другими словами, все данные, поступающие в cerr, немедленно выводятся на экран. Это отлично подходит для вывода ошибок на



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

Зачем создавать потоки, если отлично работает функция printfO?

Функция printfO не контролирует строго типы выводимых данных, чего требуют стандарты С++. Кроме того, эта функция не поддреживает работу с классами.

Когда следует применять метод putback()?

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

Когда следует использовать функцию ignoreO?

Наиболее часто она используется после функции get(). Поскольку последняя оставляет в буфере символ разрыва сфоки, иногда за вызовом функции get() следует вызов ignore(1, Дп);. Эта функция, как и putbackO, используется, как правило, при синтаксическом разборе файлов.

Мои друзья используют в своих профаммах на С++ функцию printfO. Можно ли и мне ее использовать?

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

Коллоквиум

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

Контрольные вопросы

1. Что такое оператор ввода и как он работает?

2. Что такое оператор вывода и как он работает?

3. Перечислите три варианта перефуженной функции cin.getO и укажите основные их отличия.

4. Чем cin. readO отличается от cin.getlineO?

5. Какая ширина устанавливается по умолчанию для вывода длинных целых чисел с помощью оператора вывода?

6. Какое значение возвращает оператор вывода?

7. Какой парамеф принимается консфуктором объекта ofstream?

8. Что устанавливает аргумент ios: : ate?



1 ... 171 172 173 [ 174 ] 175 176 177 ... 265

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика