Программирование >>  Структура ядра и системные вызовы 

1 ... 8 9 10 [ 11 ] 12 13 14 ... 98


ГЛАВА


Классы потоков ввода-вывода языка С++

в этой главе рассматриваются определенные в проекте стандарта С++ 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. Возвращает предыдущий символ-заполнитель



1 ... 8 9 10 [ 11 ] 12 13 14 ... 98

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