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