Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
umm_3690.pdf
Скачиваний:
24
Добавлен:
30.04.2015
Размер:
364.53 Кб
Скачать

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]