p align="left"> boolalpha = 0x8000 // вставлять/извлекать булевы как текст или цифры }; Поскольку эти перечислимые константы объявлены как компоненты класса ios, для доступа к ним требуется уточнение контекста, например, ios::in. Класс streambuf обеспечивает создание и использование буфера ввода-вывода и содержит компоненты-данные для управления буфером и методы доступа к данным в буфере. Объект класса ios содержит указатель на связанный с ним объект streambuf. Классы istream и ostream являются производными от класса ios, в них определены функции, выполняющие ввод (istream) и вывод (ostream) данных базовых типов и строк. В классе istream определены операции бесформатного ввода (без преобразования вводимых данных)и операции форматного ввода с преобразованием из внешнего представления во внутреннее. Функции get() читают из потока данные типа char в массив, определяемый первым параметром, второй параметр задает максимальное число вводимых символов (l), третий параметр устанавливает символ-ограничитель, ограничивающий ввод. За последним введенным символом в массив пишется символ `\0'. istream _FAR & _RTLENTRY get( char _FAR *, int l, char = '\n'); istream _FAR & _RTLENTRY get( signed char _FAR *, int l, char = '\n'); istream _FAR & _RTLENTRY get( unsigned char _FAR *, int l, char ='\n'); Функции read() выполняют чтение из потока и занесение в массив указанного числа символов istream _FAR & _RTLENTRY read( char _FAR *, int l); istream _FAR & _RTLENTRY read( signed char _FAR *, int l); istream _FAR & _RTLENTRY read(unsigned char _FAR *, int l); Для ввода строки, заканчивающейся символом-ограничителем, служит функция getline() при этом символ-ограничитель также заносится в массив istream _FAR & _RTLENTRY getline( char _FAR *, int, char = '\n'); istream _FAR & _RTLENTRY getline( signed char _FAR *, int, char= '\n'); istream _FAR & _RTLENTRY getline(unsigned char _FAR *, int, char= '\n'); Для извлечения из потока данных типа char вплоть до символа-ограничителя служит вариант функции get(): istream _FAR & _RTLENTRY get(streambuf _FAR &, char = '\n'); Другие варианты функции get() обеспечивают извлечение одного символа istream _FAR & _RTLENTRY get( char _FAR &); istream _FAR & _RTLENTRY get( signed char _FAR &); istream _FAR & _RTLENTRY get(unsigned char _FAR &); int _RTLENTRY get(); // возвращает значение символа int _RTLENTRY peek(); // возвращает следующий символ без удаления его из потока int _RTLENTRY gcount(); // число символов, извлеченных из потока // возвращение указанного символа в поток ввода istream _FAR & _RTLENTRY putback(char); Пропуск символов с остановкой по ограничителю выполняет функция istream _FAR & _RTLENTRY ignore(int = 1, int = EOF); Форматный ввод релизуется на основе переопределения операций ввода istream _FAR & _RTLENTRY operator>> (bool _FAR &); istream _FAR & _RTLENTRY operator>> (istream _FAR & (_RTLENTRY *_f)(istream _FAR &)); istream _FAR & _RTLENTRY operator>> (ios _FAR & (_RTLENTRY *_f)(ios _FAR &) ); istream _FAR & _RTLENTRY operator>> ( char _FAR *); istream _FAR & _RTLENTRY operator>> ( signed char _FAR *); istream _FAR & _RTLENTRY operator>> (unsigned char _FAR *); istream _FAR & _RTLENTRY operator>> ( char _FAR &); istream _FAR & _RTLENTRY operator>> ( signed char _FAR &); istream _FAR & _RTLENTRY operator>> (unsigned char _FAR &); istream _FAR & _RTLENTRY operator>> (short _FAR &); istream _FAR & _RTLENTRY operator>> (int _FAR &); istream _FAR & _RTLENTRY operator>> (long _FAR &); istream _FAR & _RTLENTRY operator>> (unsigned short _FAR &); istream _FAR & _RTLENTRY operator>> (unsigned int _FAR &); istream _FAR & _RTLENTRY operator>> (unsigned long _FAR &); istream _FAR & _RTLENTRY operator>> (float _FAR &); istream _FAR & _RTLENTRY operator>> (double _FAR &); istream _FAR & _RTLENTRY operator>> (long double _FAR &); Извлечение из istream и вставка в объект типа streambuf выполняет оператор-функция istream _FAR & _RTLENTRY operator>> (streambuf _FAR *); Макрос FAR управляет способом представления указателей, макрос RTLENTRY определяет применение стандартной билиотеки времени выполнения. Аналогичные операции для вывода определены в классе ostream: // вставить символ в поток ostream _FAR & _RTLENTRY put( char); ostream _FAR & _RTLENTRY put(signed char); ostream _FAR & _RTLENTRY put(unsigned char); // вставить в поток строку ostream _FAR & _RTLENTRY write(const char _FAR *, int l); ostream _FAR & _RTLENTRY write(const signed char _FAR *, int l); ostream _FAR & _RTLENTRY write(const unsigned char _FAR *, int l); Операции форматированного вывола Вывод "true" или "false" для данных типа bool ostream _FAR & _RTLENTRY ostream::operator<< (bool); Вывод ланных типа char ostream _FAR & _RTLENTRY operator<< ( char); ostream _FAR & _RTLENTRY operator<< ( signed char); ostream _FAR & _RTLENTRY operator<< (unsigned char); Вывод числовых данных с преобразованием во внешнее представление ostream _FAR & _RTLENTRY operator<< (short); ostream _FAR & _RTLENTRY operator<< (unsigned short); ostream _FAR & _RTLENTRY operator<< (int); ostream _FAR & _RTLENTRY operator<< (unsigned int); ostream _FAR & _RTLENTRY operator<< (long); ostream _FAR & _RTLENTRY operator<< (unsigned long); ostream _FAR & _RTLENTRY operator<< (float); ostream _FAR & _RTLENTRY operator<< (double); ostream _FAR & _RTLENTRY operator<< (long double); Вывод строк, оканчивающихся нулевым байтом ostream _FAR & _RTLENTRY operator<< (const char _FAR *); ostream _FAR & _RTLENTRY operator<< (const signed char _FAR*); ostream _FAR & _RTLENTRY operator<< (const unsigned char _FAR*); Вывод значения указателя в символьном формате ostream _FAR & _RTLENTRY operator<< (void _FAR *); Извлечение данных их объекта streambuf и вставка в тот же ostream ostream _FAR & _RTLENTRY operator<< (streambuf _FAR *); Вывод значений манипуляторов ostream _FAR & _RTLENTRY operator<< (ostream _FAR & (_RTLENTRY *_f)(ostream _FAR &)); ostream _FAR & _RTLENTRY operator<< (ios _FAR & (_RTLENTRY *_f)(ios _FAR &)); Имеется также класс iostream, производный от класса ios и объединяющий возможности классов istream и ostream. Для рассмотренных выше классов отсутствуют конструкторы копирования и операция присваивания, точнее, они объявлены, но не определены. Для тех случаев, когда конструктор копирования и операция присваивания необходимы, предусмотрены классы istream_withassign, ostream_withassign и iostream_withassign. Как экземпляры объектов этих классов всегда объявляется объект cin (экземпляр istream_withassign), обычно предназначенный для ввода с клавиатуры, и объекты cout, cerr и clog (экземпляры ostream_withassign), обычно предназначенные для вывода на экран. Ввод-вывод для дисковых файлов обепечивается классами, описания которых содержатся в файле fstream.h. Класс filebuf, производный от streambuf, предназначен для добавления в streambuf дополнительных средств управления буфером ввода-вывода. Класс fstreambase, производный от класса ios, служит базой для остальных классов, обеспечивающих файловый ввод-вывод, в нем определены методы: void _RTLENTRY open(const char _FAR *, int, int = filebuf::openprot); void _RTLENTRY attach(int); void _RTLENTRY close(); void _RTLENTRY setbuf(char _FAR *, int); Назначение этих методов очевидным образом следует из их названий. Для непосредственной работы с файлами служат классы ifstream, ofstream и fstream, базой для них служат классы fstreambase и, соответственно, istream, ostream и iostream. 6.2. Вывод в файл. Ввод из файлаДля вывода данных в дисковый файл в программе должна присутствовать директива препроцессора #include <fstream.h> подключающая описания необходимых классов.Прежде чем выводить данные необходимо создать объект типа ofstream, для которого имеется несколько конструкторов: _RTLENTRY ofstream(); // Пустой объект, без привязки к файлу // С привязкой к файлу, полное имя которого задается первым аргументом: _RTLENTRY ofstream(const char _FAR *, int = ios::out, int = filebuf::openprot); // С привязкой к ранее открытому файлу, заданному своим дескриптором _RTLENTRY ofstream(int); // То же, что и предыдущий вариант, но задается новый буфер вывода _RTLENTRY ofstream(int __f, char _FAR *, int); Наиболее часто оказывается полезным второй вариант конструктора, в котором указывается только первый параметр - полное имя файла. Этот конструктор создает объект типа ofstream, открывает указанный файл и присоединяет его к потоку вывода. Собственно операции вывода реализуются вызовом методов put, write или с использованием переопределенных операций <<. Аналогичным способом обеспечивается и ввод из файла: создается объект типа ifstream и для ввода применяются методы get, read или переопределенные операции >>. Для типа ifstream имеется набор аналогичных конструкторов: _RTLENTRY ifstream(); _RTLENTRY ifstream(const char _FAR *,int = ios::in, int = filebuf::openprot); _RTLENTRY ifstream(int); _RTLENTRY ifstream(int __f, char _FAR *, int); В качестве примера рассмотрим программу, копирующую данные из одного файла в другой. #include <fstream.h> #include <process.h> // Для вызова exit int main ( int argc, char* argv [ ] ) { char ch; if ( argc != 3 ) // Проверка числа аргументов { cerr << “ Вызов dcopy файл1 файл2 \n” ; exit ( 1 ) ; } ifstream source( argv [ 1 ] ) ; // Входной поток if ( ! source ) { cerr << “ Нельзя открыть входной файл “ << argv [ 1 ] ; exit ( 1 ); } ofstream dest ( argv [2 ] ) ; if ( ! dest ) { cerr << “ Нельзя открыть выходной файл “ << argv [ 2 ] ; exit ( 1 ); } while ((ch = source.get ( ) ) != EOF ) dest.put( ch ); close ( source ); close ( dest ); return 0 ; } 6.3. Ввод-вывод данных объектных типовОрганизация вывода данных определенных программистом объектных типов, в общем случае зависит от предполагаемого дальнейшего использования этих данных. Могут сохраняться в файле все компоненты данные, или только часть из них, может применяться форматированный или бесформатный вывод. Часто возникает необходимость сохранить объектные данные в файле для последующего их восстановления в той же или другой программе. Для вывода объекта в файл в определение класса может быть включена функция-компонента с параметром ссылкой на объект типа ostream. Часто такой функции назначают имя print или printon. Более изящным считается переопределение оператора << для вывода объектного данного. Если компоненты-данные объекта имеют уровень доступа protected или private, а оператор << не является компонентой класса, его следует объявить как friend-метод.
Страницы: 1, 2, 3, 4, 5, 6
|