|
Программирование >> Структура ядра и системные вызовы
ГЛАВА Классы потоков ввода-вывода языка С++ в этой главе рассматриваются определенные в проекте стандарта С++ ANSI/ISO классы потока ввода-вывода в языке С++. С их помощью пользователи выполняют операции ввода-вывода со стандартными потоками ввода и вывода, файлами и буферами символов. Классы потоков в значительной мере устраняют необходимость использовать функции потокового ввода-вывода языка С, строковые функции и функции класса printf. Преимущество применения классов потока ввода-вывода С++ заключается в том, что они позволяют компилятору в большей степени контролировать типы указываемых фактических параметров, а также могут быть расширены для поддержки классов, определяемых пользователем. Для классов потока ввода-вывода существуют три основных заголовка. В заголовке <iostream.h> объявляются классы istream, ostream и iostream, предназначенные для проведения операций ввода-вывода со стандартными потоками, а также используемые в большинстве программ на С++ объекты cout, cin, cerr и clog. В заголовке <fstream.h> объявляются классы ifstream, ofstream и fstream для операций ввода-вывода с дисковыми файлами, а в заголовке <strstream.h> - классы istrstream, ostrstream и strstream для форматирования данных с использованием буферов символов. Хотя классы потока ввода-вывода, в особенности такие объекты, как cout, cin и cerr, широко используются в приложениях, написанных на языке С++, не все пользователи в полной мере знакомы с их свойствами; многие учебники по программированию на С++ также не содержат их полных характеристик. Поэтому в настоящей главе дается исчерпывающее описание упомянутых классов. 3.1. Классы ввода-вывода в стандартные потоки в заголовке <iostream.h> объявляются, как уже упоминалось, три класса стандартных потоков ввода-вывода: istream, ostreatn и iostream. Класс istream служит для ввода данных из потока ввода, класс ostream предназначен для вывода данных в поток вывода, а класс iostream - для ввода данных и их вывода в поток. Кроме этих классов, в заголовке <iostream.h> также объявляются четыре объекта. Потоковый объект Класс, поток ввода-вывода ----* cin istream, стандартный поток ввода cout охггеаш, стандартный поток вывода cerr ostream, стандартный поток ошибок при выводе без буфе- ризации clog ostream, стандартным поток ошибок при выводе с буфери- зацией Обратите внимание на то, что объекты cin, cout, clog и cerr используют дескрипторы файлов, отличные от тех, которые применяются потоками stdin, stdout и stderr в языке С. Однако пользователи могут заставить объекты cin и stdin использовать один дескриптор, объекты cout и stdout - другой дескриптор, а объекты cerr, с% и - третий дескриптор. Это делается с помощью статической функции: ios::sync with stdio (); Указанная функция должна быть вызвана в пользовательской программе до выполнения операций потокового ввода-вывода. 3.1.1. Класс istream Класс istream предназначен для извлечения данных из потока ввода. К этому классу принадлежит объект cin. Ниже перечислены операции пользовательского уровня, определенные для класса istream. Операция Функция >> Извлекает из потока ввода данные любого стандартного типа, разделенные пробельными символами (white space character; к ним относятся пробелы, знаки табуляции, символы новой строки и новой страницы и т.п.) Извлекает из потока ввода символ. Пробельные символы воспринимаются как допустимые Извлекает из потока ввода size байтов данных и помещает их в buf istream& get(char с), int get() istream& read(char* buf, int size) istream& getline(char* buf.int limit, char delimiter=\n ) int gcountO istream& putback(char c) int peekO istream& ignore(int limit=1, int delimiter=EOF) Streampos tellgO istream& seekg(streampos offset, seek dir d=ios::beg) Извлекает из потока данные до тех пор, пока не встретится символ-разделитель или признак конца файла ввода, но не более limit-1 байтов данных. Извлеченные данные помещаются в buf. Символ-разделитель, если таковой обнаруживается, в buf не. заносится Возвращает количество байтов, извлеченных последним вызовом read или getline Помещает указанный символ с обратно в поток ввода Возвращает значение следующего символа в потоке ввода, но не извлекает его Отбрасывает до limif символов в потоке ввода либо пока не встретится символ-разделитель или признак конца файла (EOF) Возвращает текущее смещение в байтах маркера потока относительно начала потока Перемещает маркер потока на offset байтов от начала файла (если uNios::beg), от текущей позиции маркера (если (=ios::cur) или от конца файла (если uNios::end) Ниже приводится программа, похожая на UNIX-программу wc, и показано, как используются операции класса istream. Программа подсчитывает количество строк, слов и знаков в стандартном потоке ввода: /* source module: wc.С */ ♦include <iostream.h> ♦include <ctype.h> int main() { int ch, lineno=0, charno = 0, wordno = 0,- for (int last=0; cin && (ch = cin.getO) != EOF; last=ch) switch (ch) : lineno++, wordno++; break; if (cin.peek()==/) { dont count comments cin.ignore(10000,\n); lineno++; else charno++; break; charno++; if (isspace(ch) && last!=ch) wordno++; case \n case /: default: cout charno wordno lineno \n flush; return 0; Компиляция и пробное выполнение этой программы дают следующие результаты: * % СС WC.C % а.out < /etc/passwd 557 23 14 Операция может бьггь перегружена как дружественная функция для каждого класса, определяемого пользователем. Это дает возможность извлекать данные объектов класса точно так же, как это делается с объектами стандартных типов данных С++. Перегруженную функцию необходимо определить следующим образом: class X класс, определяемый пользователем { . public: friend istreams operator >> (istreams is, X& xObj) is >><данные-члены класса X>; 3.1.2. Класс ostream Класс ostream используется для направления данных в поток вывода. К этому классу принадлежат объекты cout, cerr и clog. Операции пользовательского уровня, определенные для класса ostream, перечислены ниже. Операция Функция ostream& put(char ch) ostream& write(const char*buf, int size) typedef streampos long; streampos tellpQ ostream& seekp(streampos offset, seek dir d=ios::beg) ostream& flush() Направляет данные любого стандартного типа в поток вывода Помещает символ ch в поток вывода Помещает size байтов данных, находящихся в buf, в поток вывода Возвращает значение смещения маркера потока (в байтах) относительно начала потока Перемещает маркер потока на ojfsel байтов от начала файла (если c/=ios::beg), от текущей позиции маркера (если J=ios::cur) или от конца файла (если u=ios::end) Принудительно очищает буферы, сбрасывая их содержимое в поток вывода Приведенные ниже команды демонстрируют использование объектов класса ostream: cout х= X ,у= у \п ; cout.putCSn ).write( Hello world ,11).put( \n); Операция может быть перегружена как дружественная функция для каждого класса, определяемого пользователем. Это дает возможность пользователям выводить на экран данные объектов класса точно так же, как это делается с экземплярами стандартных типов данных С++. Перегруженную функцию необходимо определить следующим образом: class X класс, определяемый пользователем public: friend ostreams operator (ostreams os, XS xObj) { OS <данные-члены класса X>; return OS; 3.1.3. Класс iostream Класс iostream является производным от классов istream, ostream и обладает всеми их свойствами. Данный класс используется главным образом в качестве базового для класса fstream, а последний, как правило,- при определении объектов, предназначенных для чтения и записи файлов. 3.1.4. Класс ios Классы istream, ostream и iostream содержат виртуальный базовый класс ios, который определяет состояние каждого объекта класса потока ввода-вывода. В частности, в классе ios объявляются следующие операции: Операция Функция int eof() int bad() int fail() int good() int rdstateO , void clear(bits=Oy ] int width(int len) , char fill(char ch) Возвращает I, если в потоке встретился EOF Возвращает 1, если обнаружена недопустимая операция (например, попытка смещения указателя в файле за метку EOF) Возвращает 1, если операция ввода-вывода не выполнена или если haclQ - истина Возвращает 1, если все предыдущие операции ввода-вывода выполнены успешно . Сообщает статус ошибки потокового ввода-вывода Устанавливает битовый вектор состояния ошибки в значение, указанное в hits. Если bit<F=Q, сбрасывает состояние ошибки в О , Определяет ширину поля в len при выводе последующих , данных или размер буфера п len-1 при вводе строки символов. ; Эта подпрограмма возвращает значение предыдущей ширины поля Устанавливает символ-заполнитель в ch. Возвращает предыдущий символ-заполнитель
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |