- •ПОТОКИ
- •Чтение данных из потока называется
- •По направлению обмена потоки можно
- •При высокоуровневом (или форматированном) потоковом вводе-выводе байты группируются в значащие элементы данных, например,
- •cin - стандартный поток ввода.
- •Класс ostream поддерживает операции по выводу объектов.
- •Операции «поместить в поток» и «взять из потока» – это перегруженные операции сдвига
- •- fstream, который выполняет операции ввода- вывода файлов.
- •Пример использования объекта cerr
- •Вывод встроенных типов
- •Примечание.
- •Ввод встроенных типов
- •Для контроля соответствия количества введенных символов и объема зарезервированной памяти используется функции get
- •Пример. Использование функций get() и getline()
- •Эти байты не подвергаются какому-либо форматированию.
- •Манипуляторы потоков
- •-сброс потоков;
- •Манипуляторы потоков, задающие
- •Вызов любой из этих установок точности действует для последующих операций вывода до тех
- •Пример. Вывод вещественных чисел с заданным количеством цифр после
- •Установка ширины поля
- •Если число символов в обрабатываемом значении больше, чем заданная ширина поля, то лишние
- •Метод width имеет две реализации:
- •cin.width(15);
- •Примечание. Если при первом вводе строки количество символов превысило установленное в width (15),
- •endl – вставка символа новой строки и очистка потока.
- •char str[256]; cin.width(5);
- •Пример.
- •Флаги состояний формата
- •Флаг
- •Флаг
- •long ios::flags(long) – присваивает новые значения флагам и возвращает старые.
- •basefield (dec | oct | hex) floatfield (scientific | fixed)
- •Манипуляторами с параметрами для работы с флагами:
- •cout.setf(ios::showpoint);
- •cout.setf(ios::showbase);
- •Состояние ошибок потока
- •Бит eofbit автоматически устанавливается, когда встречается признак конца файла.
- •Бит badbit устанавливается для потока при возникновении ошибки, которая приводит к потере данных.
- •Метод int ios::rdstate() возвращает текущее состояние потока.
- •Метод ios::operator!() возвращает ненулевое значение, если установлен хотя бы один бит ошибки.
- •Потоковый файл последовательного
- •Режимы открытия файлов
- •Пример. Чтение данных из файла последовательного доступа и вывод их на экран.
- •int main() {
Эти байты не подвергаются какому-либо форматированию.
Если функция read() считывает меньшее
количество символов, то устанавливается флаг failbit.
Функция gcount() сообщает о количестве символов, прочитанных последней операцией ввода.
Пример. Неформатированный ввод-вывод.
int main() { char p[256];
cout<<"Ведите предложение:\n"; cin.read(p,20);
cout<<"\nВведенное предложение:\n"; cout.write(p,cin.gcount());
cout<<"\n\nФлаг failbit = "<<cin.fail()<<endl;
cout<<"Количество введенных символов: "<<cin.gcount()<<endl;
cout<<"Содержимое переменной p:\n"; cout<<p<<endl;
return 0;
}
Форматирование данных |
|
Способы форматирования в |
потоковых |
классах: |
|
- флаги; |
|
- манипуляторы; |
|
- форматирующие методы. |
|
Манипуляторы потоков
Манипуляторы потоков – это идентификаторы, которые решают задачи форматирования.
Определённые в C++ манипуляторы потоков позволяют выполнить следующие операции:
-задание ширины полей;
-задание точности;
-установка и сброс флагов формата;
-задание заполняющего символа полей;
-сброс потоков;
-вставка символа новой строки и нулевого символа в выходной поток;
-пропуск символов разделителей во входном потоке.
Манипуляторы бывают параметризированные и непараметризированные.
Для использования параметризированных
манипуляторов необходимо подключить iomanip.h.
Можно определить собственные манипуляторы.
Манипуляторы потоков, задающие
основание чисел
dec, setbase(10) –числа в 10 с.с. oct, setbase(8) – числа в 8 с.с. hex, setbase(16) – числа в 16 с.с.
Пример. Вывод чисел в разных системах счисления.
int main() { int n=60;
cout<<"16 format: "<<hex<<n<<endl; n=100;
cout<<n<<endl;
cout<<"10 format: "<<dec<<n<<endl;
cout<<"8 format: "<<oct<<n<<endl; cout<<"16 format: "<<setbase(16)<<n<<endl;
return 0;
}
Манипуляторы потоков, задающие формат вывода вещественного числа
Число цифр после десятичной точки для
вещественного числа можно задать с помощью манипулятора потока setprecision или метода precision.
Вызов любой из этих установок точности действует для последующих операций вывода до тех пор, пока не будет произведена следующая установка точности.
В классе ios объявлено два перегруженных метода precision:
int ios::precision() – возвращает значение точности представления при выводе вещественных чисел;
int ios::precision(int) – устанавливает значение точности представления при выводе вещественных чисел, возвращает старое значение точности.
Пример. Вывод вещественных чисел с заданным количеством цифр после
десятичной точки.
#include <iostream>
#include <iomanip> using namespace std; int main() {
cout<<cout.precision()<<endl; cout.precision(10);
cout<<sqrt(3.0)<<endl; cout<<cout.precision()<<endl;
cout<<setprecision(4)<<sqrt(3.0)<<endl; return 0;
}
Установка ширины поля
Ширина поля – это число символьных позиций, в которые значение будет выведено, или число символов, которые будут выведены.
Задают:
-манипулятор setw(int w);
-метод int ios::width(int w).
Если обрабатываемые значения имеют меньше символов, чем заданная ширина поля, то для заполнения лишних позиций используются заполняющие символы.