
lk_oop-c_6-11.ppt
- Количество слайдов: 16
Лекция № 6 по дисциплине «Объектно-ориентированное программирование» на тему: Классы ввода-вывода в С++
Потоки ввода-вывода В С++ ввод-вывод данных производится потоками байтов. Поток – это последовательность байтов. При операциях ввода байты направляются от устройства (клавиатуры, дисковода, сетевой платы) в ОП. Файл заголовка <iostream> содержит основную информацию, необходимую операциям потокового ввода-вывода. Заголовок <iomanip> содержит информацию, необходимую для управления форматируемым вводом-выводом
Функции библиотеки iostream int good () возвращает 1, если ошибок не обнаружено int eof () возвращает 1, если поток находится в состоянии "конец файла" int fail () возвращает 1, если обнаружена восстановимая ошибка ввода-вывода int bad () возвращает 1, если обнаружена невосстановимая ошибка ввода-вывода int clear () сбрасывает состояние ошибки ввода-вывода int precision (int i) устанавливает точность вывода чисел с плавающей точкой int width (int i) устанавливает ширину поля вывода
Пример #include <iostream. h> int i; char buff[80]; do{ if (cin. fail()) cin. clear(); // сброс состояния //ошибки cout << "Введите число и символьную строку: "; cin >> i; if (cin. fail()) { cout << "Нужно ввести число"; cin. sync(); continue; }
Продолжение примера cin >> setw(sizeof(buff)+1) >> buff; if (cin. fail()) { cout << "Нужно ввести строку"; cin. sync(); continue; } } while (cin. fail()&&!cin. bad()); if (!cin. bad()) { cout << "Вы ввели число: " << i << "n" << "Вы ввели строку: " << buff << "n"; }
Манипуляторы ввода-вывода Манипуляторы позволяют менять режимы операций ввода-вывода непосредственно в выражениях внесения в поток или извлечения из потока. Например, можно ограничить размер буфера cin, применяя функцию width(): cin. width(sizeof(buff)); cin >> buff; Используя манипулятор setw(), можно определить размер буфера так cin >> setw (sizeof (buff)+1) >> buff;
Стандартные манипуляторы библиотеки iostream Существует два вида манипуляторов ввода- вывода: параметризованные и непараметризованные. dec устанавливает базу для преобразования чисел к 10 -ичному формату, hex 16 -ичный формат ws пропуск начальных пробелов ends выводит нулевой символ endl выводит признак конца строки setfill (int ch) Устанавливает символзаполнитель setiosflags (int f) устанавливает флаги потока resetiosflags (int f) сбрасывает флаги потока
Флаги потока left выравнивание по левому краю right выравнивание по правому краю showbase выводить показатель базы showpoint выводить десятичную точку для чисел с плавающей точкой uppercase 16 -ричные большие буквы showpos показать "+" для положительных целых чисел scientific установить экспоненциальную форму для чисел с плавающей точкой fixed установить формат чисел с фиксированной плавающей точкой
Пример манипулятора ostream & right(ostream &s) { s << resetiosflags(ios: : left) << setiosflags(ios: : right); return s; } Функция-манипулятор изменяет биты флагов потока, переданного ей в качестве аргумента cout << setw(20) << right<< 1234 << endl;
Файловые и строковые потоки При создании выходных файловых потоков вначале создается объект для буферизации типа filebuf, а затем этот объект связывается с новым объектом типа ostream для последующего вывода в этот новый объект. Пример. filebuf mybuff; // создаем буферный объект // увязывем этот буфер с файлом output для вывода mybuff. open("output", ios: : out); ostream mycout(&mybuff); // новый потоковый объект mycout <<12<<ends; mybuff. close();
Пример ввода из файла int i; // сразу создается буферизованный потоковый //объект, связанный с файлом input ifstream mycin("input"); mycin >> i; Если программе будут использованы файловые потоки, то необходимо подключить заголовочный файл fstream. h. Если будут применяться строковые потоки, то нужно подключить заголовочный файл strstream. h.
Примеры со вводом-выводом строк char mybuff[128]; ostrstream mycout (mybuff, sizeof(mybuff)); mycout << 123 << ends; int i; char mybuff[128]= "123"; istrstream mycin (mybuff, sizeof(mybuff)); mycin >> i;
Функции бесформатного ввода-вывода Бесформатный ввод-вывод выполняется функциями read класса istream и write класса ostream Пример использования бесформатного вводавывода. #include<iostream. h> int main() { const int size=80; char buffer[size]; cin. read(buffer, 20); cout. write(buffer, cin. gcount()); cout<<endl; return 0; }
Часто применяемые функции потока Пропуск символов при вводе. istream& istream: : ignore(int n, int d = EOF) — извлекает символы из потока, пока не встретит ограничитель d или пока не извлечет n символов. Заглядывание вперед. int istream: : peek( ) — возвращает значение очередного символа, не извлекая его из потока. Возврат символа в поток. istream& istream: : putback( ) — возвращает символ во входной поток, как в стек Позиционирование потока istream& istream: : seekg(long pos); ostream& ostream: : seekg(long pos); Определение текущей позиции потока. long istream: : tellg( ); long ostream: : tellp( );
Ошибки потоков ввода-вывода Бит входного потока eofbit устанавливается, когда в потоке встречается конец файла. Вызов cin. eof() возвращает true, если в cin встретился конец файла. Бит failbit устанавливается, если в потоке происходит ошибка форматирования, но символы при этом не теряются. Функция fail() сообщает об этой ошибке. Бит badbit устанавливается, если произошла ошибка, приведшая к потере данных. Бит goodbit устанавливается, если для потока не установлен ни один из битов eofbit, failbit или badbit. Функция rdstate() возвращает состояние потока. Например, вызов cout. rdstate() возвратит состояние потока cout, и затем можно проверить флаги eofbit, failbit, badbit, goodbit.
Пример #include<iostream. h> int main() { int x; cout<<cin. rdstate()<<” “<<cin. eof()<<” ”<<cin. fail()<< “ ”<<cin. bad()<<” ”<<cin. good(); // 0 0 1 cin>>x; // введем символ вместо целого числа cout<<cin. rdstate()<<” “<<cin. eof()<<” ”<<cin. fail()<< “ ”<<cin. bad()<<” ”<<cin. good(); // 2 0 1 0 0 cin. clear(); return 0; }
lk_oop-c_6-11.ppt