Основы алгоритмизации и программирования. Лекция 13

Содержание

Слайд 2

Мем в начале

Мем в начале

Слайд 3

Содержание лекции Потоковые классы Потоковый ввод/вывод файлов Вопросы из теста Экзамен

Содержание лекции

Потоковые классы
Потоковый ввод/вывод файлов
Вопросы из теста
Экзамен

Слайд 4

Потоковые классы Поток – общее название потока данных (внезапно!). В C++

Потоковые классы

Поток – общее название потока данных (внезапно!). В C++ поток

представляет собой объект некоторого класса.
Разные потоки предназначены для представления разных видов данных. Например, ifstream – поток данных от входного дискового файла.
Уже знакомые потоковые объекты: cin, cout, cerr etc.
Слайд 5

Преимущества Простота использования: каждый объект знает, как он должен выглядеть на

Преимущества

Простота использования: каждый объект знает, как он должен выглядеть на экране.
Можно

перегружать стандартные операторы и функции вставки и извлечения (<< и >>) для работы с создаваемыми классами.
Потоки – лучший способ записывать данные в файл и лучший способ организации данных для последующего использования при вводе/выводе текста в элементах GUI.
Слайд 6

Иерархия потоковых классов

Иерархия потоковых классов

Слайд 7

istream vs ostream istream содержит: get() getline() read() >> … ostream содержит: put() write() …

istream vs ostream

istream содержит:
get()
getline()
read()
>>

ostream содержит:
put()
write()
<<

Слайд 8

Класс ios Класс ios – родительский для всех потоковых классов и

Класс ios

Класс ios – родительский для всех потоковых классов и обладает

большинством особенностей, без которых работа с потоками была бы невозможна. Это:
Флаги форматирования
Флаги ошибок
Режим работы с файлами
Слайд 9

Класс ios: флаги форматирования Флаги форматирования – это набор определений enum

Класс ios: флаги форматирования

Флаги форматирования – это набор определений enum в

классе ios. Они работают переключателями, определяющими различные форматы и способы ввода/вывода.
int p = 404;
cout.unsetf(ios::dec);
cout.setf(ios::hex | ios::showbase);
cout << "p=" << p << endl;
// p=0x194
Слайд 10

Флаги форматирования

Флаги форматирования

Слайд 11

Класс iomanip: манипуляторы Манипуляторы встраиваются непосредственно в операторы ввода-вывода Для корректного

Класс iomanip: манипуляторы

Манипуляторы встраиваются непосредственно в операторы ввода-вывода
Для корректного использования всех

манипуляторов необходимо подключить библиотеку iomanip с помощью оператора.
#include
cout << "x=" << right << setw(10)
<< setprecision(4) << setfill('#')
<< (float) 1/7 << endl;
// x=####0.1429
Слайд 12

Манипуляторы форматирования

Манипуляторы форматирования

Слайд 13

Класс ios: функции

Класс ios: функции

Слайд 14

Примеры int r = -25; cout.setf(ios::right); cout.width(10); cout cout // ########r=-25

Примеры

int r = -25;
cout.setf(ios::right);
cout.width(10);
cout << setfill('#') << "r=" << r <<

endl;
cout << setfill('#') << setw(10) << "r=" << r;
// ########r=-25
double d = 1234.56789;
cout.precision(3);
cout.setf(ios::fixed);
cout << "d=" << d << endl;
cout << "d=" << setprecision(3) << d << endl;
// d=1234.568
Слайд 15

Класс istream: извлечение

Класс istream: извлечение

Слайд 16

Класс ostream: вставка

Класс ostream: вставка

Слайд 17

Предопределенные потоковые объекты cin, объект istream_withassign, используется для операций ввода с

Предопределенные потоковые объекты

cin, объект istream_withassign, используется для операций ввода с клавиатуры
cout,

объект ostream_withassign, используется для операций вывода на экран монитора
cerr, объект ostream_withassign, используется для сообщений об ошибках
clog, объект ostream_withassign, используется для ведения журнала
Слайд 18

Ошибки потоков: флаги статуса ошибок

Ошибки потоков: флаги статуса ошибок

Слайд 19

Ошибки потоков: функции для флагов ошибок

Ошибки потоков: функции для флагов ошибок

Слайд 20

Пример int main() { int i; cin.unsetf(ios::skipws); while(true) { cout cin

Пример

int main() {
int i;
cin.unsetf(ios::skipws);
while(true) {
cout << "\nEnter

the integer number: ";
cin >> i;
if (cin.good()) {
cin.ignore(10, '\n');
break;
}
cin.clear();
cout << "Wrong input!";
cin.ignore(10, '\n');
}
cout << "Entered integer number: " << i << endl;
}
Слайд 21

Потоковый ввод/вывод файлов При работе с файлами используются три специальных класса:

Потоковый ввод/вывод файлов

При работе с файлами используются три специальных класса:
ifstream
ofstream
fstream
Объекты этих

классов могут ассоциироваться с файлами, а методы – использоваться для обмена данными с ними.
Слайд 22

Пример: запись данных int main() { char ch = 'x'; int

Пример: запись данных

int main() {
char ch = 'x';
int i

= 111;
double d = 6.02;
string str = "hello_world";
ofstream file("example.txt"); // #include
file << ch << ' '
<< i << ' '
<< d << ' '
<< str;
// x 111 6.02 hello_world
}
Слайд 23

Пример: чтение данных int main() { char ch; int i; double

Пример: чтение данных

int main() {
char ch;
int i;
double d;

string str;
ifstream file("example.txt"); // #include
file >> ch >> i >> d >> str;
cout << ch << endl
<< i << endl
<< d << endl
<< str << endl;
}
Слайд 24

Пример: запись с пробелами int main() { fstream file("example.txt"); // #include

Пример: запись с пробелами

int main() {
fstream file("example.txt"); // #include


file << "File Line 1" << endl;
file << "File Line 2" << endl;
file << "File Line 3" << endl;
char buffer[80];
while (!file.eof()) {
file.getline(buffer, 80);
cout << buffer << endl;
}
}
Слайд 25

Исправленный пример int main() { fstream file("example.txt"); file file file file.seekg(0);

Исправленный пример

int main() {
fstream file("example.txt");
file << "File Line 1"

<< endl;
file << "File Line 2" << endl;
file << "File Line 3" << endl;
file.seekg(0);
char buffer[80];
while (!file.eof()) {
file.getline(buffer, 80);
cout << buffer << endl;
}
}
Слайд 26

Ввод/вывод символов int main() { string str = "hello_world"; fstream file("example.txt");

Ввод/вывод символов

int main() {
string str = "hello_world";
fstream file("example.txt"); //

#include
for(int i = 0; i < str.size(); i++)
file.put(str[i]);
file.seekg(0);
char ch;
while(file) {
file.get(ch);
cout << ch;
}
}
Слайд 27

Двоичный ввод/вывод int main() { int arr[100]; for(int i = 0;

Двоичный ввод/вывод

int main() {
int arr[100];
for(int i = 0; i

< 100; i++) arr[i] = i*i;
ofstream outfile("example.dat", ios::binary);
outfile.write(
reinterpret_cast(arr), 100*sizeof(int));
outfile.close();
ifstream infile("example.dat", ios::binary);
infile.read(
reinterpret_cast(arr), 100*sizeof(int));
for(int j = 0; j < 100; j++) cout << arr[j] << ' ';
}
Слайд 28

Биты режимов int main() { fstream file; file.open( "example.txt", ios::app |

Биты режимов

int main() {
fstream file;
file.open(
"example.txt",
ios::app | ios::out

| ios::in | ios::binary);
// do your stuff
file.close();
}
Слайд 29

Указатели файлов У каждого файлового объекта есть два ассоциированных с ним

Указатели файлов

У каждого файлового объекта есть два ассоциированных с ним значения:
Указатель

чтения (текущая позиция чтения)
Указатель записи (текущая позиция записи)
Эти значения определяют номер байта относительно начала файла, с которого будет производиться чтение или запись.
Слайд 30

Вычисление позиции int main() { fstream file("example.txt"); file cout file.seekg(6); //

Вычисление позиции

int main() {
fstream file("example.txt");
file << "Hello world";
cout

<< "Current position: " << file.tellg() << endl; // 11
file.seekg(6); // file.seekg(-5, ios::end);
cout << "Current position: " << file.tellg() << endl; // 6
string str;
file >> str;
cout << str << endl; // world
}
Слайд 31

Обработка ошибок fstream file("example.txt"); if (!file) cerr file.write(/* ... */); if

Обработка ошибок

fstream file("example.txt");
if (!file) cerr << "Cannot open file!" << endl;
file.write(/*

... */);
if (!file) cerr << "Cannot write into file!" << endl;
file.close();
file.read(/* ... */);
if (!file) {
cerr << "Cannot read from file!" << endl;
cerr << "Error code: " << file.rdstate() << end;
// file.good(), file.eof(), file.fail(), file.bad()
}
Слайд 32

Слайд 33

Пример вопроса на экзамене Биты режимов, такие, как app и ate:

Пример вопроса на экзамене

Биты режимов, такие, как app и ate:
Определяются в

классе ios
Могут устанавливать, для чтения или записи открыт файл
Работают с функциями put() и get()
Устанавливают режимы открытия файлов
Слайд 34

Пример задачи на экзамене Программа должна запрашивать у пользователя данные, состоящие

Пример задачи на экзамене

Программа должна запрашивать у пользователя данные, состоящие из

ФИО и номера работника (до ввода какого-либо разделителя).
Затем программа должна осуществить форматированный вывод в объект ofstream с помощью оператора вставки.
Когда пользователь сообщит об окончании ввода, необходимо закрыть объект ofstream и прочитать содержимое файла с выводом на экран с использование класса ifstream.
Слайд 35

Экзамен Тест 20 вопросов с вариантами ответов 20 минут 1 попытка

Экзамен

Тест
20 вопросов с вариантами ответов
20 минут
1 попытка (естественно! ☺)
Максимальная оценка –

10 баллов
Задача
Для тех, кто ответит правильно на 16+ вопросов (80%)
Тест + задача = 10 баллов