Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование_на_С++_Ч2_ООП.doc
Скачиваний:
54
Добавлен:
22.02.2015
Размер:
633.34 Кб
Скачать

Манипуляторы

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

Простые манипуляторы

dec – устанавливает флаг десятичной системы;

oct – устанавливает флаг восьмеричной системы;

hex – устанавливает флаг шестнадцатеричной системы;

ws – устанавливает при вводе извлечение пробельных символов;

endl – при выводе включает в поток символ новой строки и выгружает буфер;

ends – при выводе включает в поток нулевой символ;

flush – при выводе выгружает буфер.

Изменение системы счисления действует до следующего явного изменения.

Пример

cout << 13 << hex << ‘ ‘ << 13 << oct << ‘ ‘ << 13 << endl;

На экране:

13 d 15

Параметризованные манипуляторы

Параметризованные манипуляторы – это манипуляторы, имеющие аргумент. Для их использования необходимо подключать заголовочный файл <iomanip>.

setbase (int n) – задает основание системы счисления (n = 8, 10, 16 или 0). 0 – основание по умолчанию (десятичное, кроме случаев, когда вводятся восьмеричные или шестнадцатеричные числа);

resetiosflags ( long) – сбрасывает флаги состояния потока, биты которых установлены в параметре;

setfill (int) – устанавливает символ-заполнитель с кодом, равным значению параметра;

setprecision (int) – устанавливает максимальное количество цифр в дробной части чисел;

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,

lim = ‘\n’)

Считывает num-1 символов (или пока не встретится символ lim) и копирует их в строку buf. Вместо символа lim в строку записывается признак конца строки (‘\0’). Символ lim остается в потоке. Возвращает ссылку на текущий поток


getline (buf, num,

lim = ‘\n’)

Аналогична get ( ), но копирует в buf и символ lim

ignore (num = 1,

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 ) {

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);

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 {

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

Строка: Пока