- •ПОТОКИ
- •Чтение данных из потока называется
- •По направлению обмена потоки можно
- •При высокоуровневом (или форматированном) потоковом вводе-выводе байты группируются в значащие элементы данных, например,
- •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() {
Метод int ios::rdstate() возвращает текущее состояние потока.
Пример использования метода rdstate():
int k=cin.rdstate();
if(k & ios::eofbit) cout<<"Достигнут конец файла"<<endl;
Метод int ios::clear(int = 0) без параметров
(вызов по умолчанию) сбрасывает флаги ошибки: например, cin.clear().
Метод int ios::clear(int) позволяет установить заданный флаг: например, cin.clear(failbit).
Метод ios::operator!() возвращает ненулевое значение, если установлен хотя бы один бит ошибки.
Пример. Проверка состояний ошибок потока
#include <iostream> using namespace std; int main() {
int x; cout<<cin.rdstate()<<endl;
cout<<cin.eof()<<endl; cout<<cin.fail()<<endl; cout<<cin.bad()<<endl; cout<<cin.good()<<endl;
cin>>x; cout<<cin.rdstate()<<endl; cout<<cin.eof()<<endl; cout<<cin.fail()<<endl; cout<<cin.bad()<<endl; cout<<cin.good()<<endl;
cout<<!cin<<endl;
cin.clear(); cout<<cin.fail()<<endl; cout<<cin.good()<<endl;
cout<<!cin<<endl; return 0; }
Потоковый файл последовательного
доступа
Пример. Занесение данных о студенте, его группе и среднем балле в текстовый файл.
#include <iostream>
#include <fstream> using namespace std; int main() {
ofstream outGroupFile("student.dat",ios::out);
if(!outGroupFile) {
cerr<<"File not open"<<endl; return 0;
}
double AverMark; cout<<"?: ";
while(cin>>name>>group>>AverMark) outGroupFile<<name<<' ' <<group<<'
'<<AverMark<<'\n';
outGroupFile.close(); return 0;
}`
Замечание. Открыть файл в программе можно с помощью метода open, имеющего такие же параметры как и конструктор. Например, ofstream outGroupFile; outGroupFile.open("student.dat",ios::out);
Режимы открытия файлов
Режим |
Описание |
ios::app |
Записать данные в конец файла без |
|
модификации имеющихся данных в |
|
файле. |
ios::ate |
Переместиться в конец исходного |
|
открытого файла. Данные могут быть |
|
записаны в любое место файла. |
ios::in |
Открыть файл для ввода. |
ios::out |
Открыть файл для вывода. |
ios::trun |
Уничтожать содержимое файла, если |
c |
он существует. |
ios::bin |
Открыть файл для двоичного ввода |
ary |
или вывода. |
Пример. Чтение данных из файла последовательного доступа и вывод их на экран.
#include <iostream>
#include <iomanip>
#include <fstream> using namespace std;
void OutputLine(const char* name, const char *group, double mark) {
cout<<setiosflags(ios::left)<<setw(20)<<name<<se
tw(10)<<group<<setw(8)<<setprecision(2)<<reseti
osflags(ios::left)<<mark<<'\n';
}
int main() {
ifstream inGroupFile; inGroupFile.open("student.dat",ios::in); if(!inGroupFile) {
cerr<<"File not open"<<endl; return 0;
}
char name[30],group[10]; double AverMark;
cout<<setiosflags(ios::left)<<setw(20)<<"Фамилия
"<<setw(10)<<"Группа"<<"Ср.
оценка\n"<<setiosflags(ios::fixed|ios::showpoint);
while(inGroupFile>>name>>group>>AverMark)
OutputLine(name,group,AverMark); inGroupFile.close();
return 0;
}