- •ВВЕДЕНИЕ
- •КЛАССЫ
- •Описание объектов
- •Указатель this
- •Конструкторы
- •Конструктор копирования
- •Статические элементы класса
- •Статические методы
- •Дружественные функции и классы
- •Дружественные функции
- •Дружественный класс
- •Деструкторы
- •Перегрузка унарных операций
- •Перегрузка бинарных операций
- •Перегрузка операции присваивания
- •Перегрузка операции приведения типа
- •НАСЛЕДОВАНИЕ
- •Ключи доступа
- •Простое наследование
- •Правила наследования методов
- •Абстрактные классы
- •ОБРАБОТКА ИСКЛЮЧИТЕЛЬНЫХ СИТУАЦИЙ
- •Синтаксис исключений
- •Перехват исключений
- •Список исключений
- •Иерархии исключений
- •СТАНДАРТНАЯ БИБЛИОТЕКА
- •Форматирование данных
- •Флаги и форматирующие методы
- •Манипуляторы
- •Методы обмена с потоком
- •Файловые потоки
- •СТРОКИ
- •Операции
- •Функции
- •Преобразование строк
- •Поиск подстрок
- •Сравнение частей строк
- •Получение характеристик строк
- •КОНТЕЙНЕРНЫЕ КЛАССЫ
- •Последовательные контейнеры
- •Векторы
- •Двусторонние очереди
- •Списки
- •Ассоциативные контейнеры
- •Словари
- •Словари с дубликатами (multimap)
- •ПРИЛОЖЕНИЕ 1. ШАБЛОНЫ ФУНКЦИЙ
- •ПРИЛОЖЕНИЕ 2. ШАБЛОНЫ КЛАССОВ
- •БИБЛИОГРАФИЧЕСКИЙ СПИСОК
setw (int) – устанавливает максимальную ширину поля вывода;
setiosflags (long) – устанавливает флаги состояния потока, биты которых в параметре равны 1.
Пример
…
double d (1.234);
cout << setfill (‘.’) << setprecision (4)
<< setiosflags (ios : : showpoint | ios : : fixed);
cout << setw (12) << d << endl;
…
На экране:
……1.2340
Методы обмена с потоком
В потоковых классах наряду с операциями извлечения >> и включения << определены методы для неформатированного чтения и записи в поток (при этом преобразования данных не выполняются). В табл. 4 приводится описание методов.
|
|
Таблица 4 |
|
|
|
|
|
Функция |
Назначение |
|
|
1 |
2 |
|
|
|
Класс istream |
|
|
gcount ( ) |
Возвращает количество символов, считанных с по- |
|
|
|
мощью последней функции |
неформатированного |
|
|
ввода |
|
|
get ( ) |
Возвращает код извлеченного из потока символа или |
|
|
|
EOF |
|
|
get (buf, num, |
Считывает num-1 символов (или пока не встретится |
|
|
lim = ‘\n’) |
символ lim) и копирует их в строкуbuf. Вместо сим- |
|
|
|
вола lim в строку записывается признак конца строки |
|
|
|
(‘\0’). Символ lim остается в |
потоке. Возвращает |
|
|
ссылку на текущий поток |
|
|
1 |
2 |
getline (buf, num, |
Аналогична get ( ), но копирует в buf и символ lim |
lim = ‘\n’) |
|
ignore (num = 1, |
Считывает и пропускает символы до тех пор, пока |
38
lim = EOF) |
не будет прочитано num символов (по умолчанию 1) |
|
или не встретится разделительlim. Возвращает |
|
ссылку на текущий поток |
|
Окончание табл. 4 |
|||
peek ( ) |
Возвращает следующий символ без удаления его из |
|
|
|
|
потока или EOF, если достигнут конец файла |
|
||
putback (c) |
Помещает в поток символ с, который становится те- |
|
|
|
|
кущим при извлечении из потока |
|
|
|
read (buf, num) |
Считывает num символов (или все символы до конца |
|
|
|
|
файла, если их меньше num) в символьный массив |
|
||
|
buf и возвращает ссылку на текущий поток |
|
|
|
readsome (buf, num) |
Считывает num символов в символьный массивbuf |
|
|
|
|
и возвращает количество считанных символов |
|
||
seekg (pos) |
Устанавливает текущую позицию чтения в значение |
|
|
|
|
pos |
|
|
|
seekg (offs, org) |
Перемещает текущую позицию чтения наoffs бай- |
|
|
|
|
тов, считая от одной из трех позиций, определяемых |
|
||
|
параметром org: ios :: beg (от начала), |
ios :: cur |
|
|
|
(от текущей позиции) и ios :: end (от конца файла) |
|
||
tellg ( ) |
Возвращает текущую позицию чтения потока |
|
|
|
|
Класс ostream |
|
|
|
flush ( ) |
Записывает содержимое потока вывода на физиче- |
|
|
|
|
ское устройство |
|
|
|
рut (с) |
Выводит в поток символ с и возвращает ссылку на |
|||
|
поток |
|
|
|
seekg (pos) |
Устанавливает текущую позицию записи в значение |
|
||
|
pos |
|
|
|
seek (ofs, org) |
Перемещает текущую позицию записи наoffs бай- |
|
||
|
тов, считая от одной из трех позиций (см. выше) |
|||
tellg ( ) |
Возвращает текущую позицию записи потока |
|
||
write (buf, num) |
Записывает в поток num символов из массива buf и |
|
||
|
возвращает ссылку на поток |
|
|
|
Пример 1. Программа считывает строки из входного потока в символьный массив.
# include <iostream.h>
int main ( ) {
const int N = 20, Len = 100;
char str [Len] [N]
int i = 0;
while (cin.getline (str [i], Len, ‘\n’) & & i < N ) {
39
i ++;} return 0;
}
Пример 2. Программа формирует файл test, в который вводится три строки (файловые потоки см. далее).
#include <iostream.h>
#include <fstream.h>
#include <string.h> int main ( ) {
// Запись в файл
ofstream out (“test”); if (!out) {
cout << “Нельзя открыть файл для записи” << endl; return 1;
}
char *str [ ] = {“the first line”, “the second line”, “the third line”}; for (int i = 0; i<3, ++ i) {
out.write (str [i], strlen (str [i])); out.put (‘\n’);
}
out.close ( );
// Чтение из файла ifstream in (“test”); if (! in) {
cout << “Нельзя открыть файл для чтения” << endl; return 1;
}
char check_str [3] [30]; for (int i = 0; i < 3; ++ i) { in.get (check_str [i], 30);
40
in.get ( ); }
for (int i = 0; i < 3; ++ i ) cout << check_str [i] << endl;
in.close ( );
return 0;
}
Пример 3. Программа с функциями peek ( ) и putback ( ).
Эти функции позволяют упростить управление, когда неизвестен тип вводимой в каждый момент времени информации. В данной программе из файла считываются либо строки, либо целые числа. Строки и целые числа могут следовать в любом порядке.
#include <iostream.h>
#include <fstream.h>
#include <stdlib>
int main ( ) {
char ch;
// Подготовка файла
ofstream out ("test");
cout << “Нельзя открыть файл test для записи” << endl;
return1;
}
char str [80], *p;
out << 123 << "Это выполняется тест" << 23;
out << "Всем привет" << 99 << “Пока” << endl;
out.close ( );
// Чтение файла
ifstream in ("test");
if (!in) {
cout << "Нельзя открыть файл test для чтения" << endl;
return 1;
}
do {
41
p = str;
ch = in.peek ( ); // определяем тип следующего значения
if (isdigit(ch)) {
while (isalpha (*p = in.get ( ))) p ++; // считываем целые
in.putback (*p); // возврат символа в поток
*р = '\0'; // заканчиваем строку нулем
cout << "Число:" << atoi (str);
}
else if (isalpha (ch)) { //считываем строку
while (isalpha (*p = in.get ( ))) p ++;
in.putback (*p); // возврат символа в поток
*p = '\0'; // заканчиваем строку нулем
cout << "Строка:" << str;
}
else in.get ( ); // пропуск
cout << endl;
} while (!in.eof ( ));
in.close ( );
return 0;
}
Результат работы программы: Число: 123 Строка: Это
Строка: выполняется Строка: тест Число: 23 Строка: Всем Строка: привет Число: 99 Строка: Пока
Ошибки потоков
42
В базовом классе ios определено поле state, которое представляет собой состояние потока в виде совокупности битов:
enum io_state {
googbit = 0x00, // Нет ошибок
eofbit = 0x01, // Достигнут конец файла
failbit = 0x02, // Ошибка форматирования или преобразования
badbit = 0x04, // Серьезная ошибка, после которой пользоваться потоком // нельзя
hardbit = 0x08 // Неисправность оборудования
};
Состоянием потока можно управлять с помощью следующих методов и операций:
int rdstate ( ) – возвращает текущее состояние потока;
int eof ( ) – возвращает ненулевое значение, если установлен флаг eofbit; int fail ( ) – возвращает ненулевое значение, если установлен один из фла-
гов failbit, badbit или hardbit;
int good ( ) – возвращает ненулевое значение, если сброшены все флаги ошибок;
void clear (int = 0) – параметр принимается в качестве состояния ошибки, при отсутствии параметра состояние ошибки устанавливается 0;
operator void *( ) – возвращает нулевой указатель, если установлен хотя бы один бит ошибки;
operator ! ( ) – возвращает ненулевой указатель, если установлен хотя бы один бит ошибки.
Пример. Наиболее часто используемые операции с флагами состояния потока:
//Проверить, установлен ли флаг flag if (steam_obj.rdstate ( ) & ios :: flag)
//Сбросить флаг flag
stream_obj.clear (rdstate ( ) & ~ios :: flag)
// Установить флаг flag
stream_obj.clear (rdstate ( ) | ios :: flag)
// Установить флаг flag и сбросить все остальные
stream_obj.clear (ios :: flag)
// Сбросить все флаги
stream_obj.clear ( )
43