Программирование в C++

Содержание

Слайд 2

Содержание 10-го занятия по практике

Потоки и файлы.
Потоковые классы. Класс istream. Класс

Содержание 10-го занятия по практике Потоки и файлы. Потоковые классы. Класс istream.
ostream.
Потоковый ввод/вывод дисковых файлов
Файловый ввод/вывод с помощью методов

Слайд 3

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

Поток — это общее название потока данных. В C++ поток представляет

Потоковые классы Поток — это общее название потока данных. В C++ поток
собой объект некоторого класса. Именно поэтому вы могли встретить в листингах потоковые объекты cin и cout. Разные потоки предназначены для представления разных видов данных.

Слайд 4

Преимущества потоков

Одним из аргументов в пользу потоков является простота использования. Каждый объект

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

Слайд 5

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

Потоковые классы имеют довольно сложную иерархическую структу-ру. Операция извлечения >>

Иерархия потоковых классов Потоковые классы имеют довольно сложную иерархическую структу-ру. Операция извлечения
является методом класса istream, опера-ция вставки << — методом класса ostream. Оба этих класса являются наследниками ios. Некоторые манипуляторы описаны в IOMANIP, а некоторые классы для работы с объектами «в памяти» определены в STRSTREAM. Класс ios является базовым для всей иерархии. Он со-держит множество констант и методов, общих для операций ввода/ вывода любых видов. Класс istream содержит функции: get(), getline(), read() и перегружаемую операцию извлечения (>>). Класс ostream содержит функции: put(), write() и перегружаемую операцию вставки (<<). Класс iostream — наследник одновременно классов istream и ostream (пример множественного наследования). Его производные классы могут использоваться при работе с объектами – дисковые файлы, которые могут быть открыты одновременно для записи и чте-ния. Классы: istream_withassign, ostream_withassign,iostream_withas-sign — являются наследниками istream, ostream и iostream соответ-ственно. Они добавляют к этим классам операторы присваивания.

Слайд 6

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

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

Слайд 7

Класс ios

ios является дедушкой всех потоковых классов и обладает большинством особенностей, без

Класс ios ios является дедушкой всех потоковых классов и обладает большинством особенностей,
которых работа с потоками была бы невозможна. Три его главных направления — это флаги форматирова-ния, флаги ошибок и режим работы с файлами.

Слайд 8

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

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

Слайд 9

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

Есть несколько способов установки флагов форматирования, для каждого

Класс ios. Флаги форматирования Есть несколько способов установки флагов форматирования, для каждого
свои. Так как они являются компонентами класса ios, обычно к ним обращаются посредством написания имени класса и оператора явного задания (например, ios::skipws). Все без исключения флаги могут быть выставлены с помощью методов setf() и unsetf(). Примеры:

cout.setf(ios::left); // выравнивание текста по левому краю
cout << "Этот текст выровнен по левому краю"
cout.unsetf(ios::left); // вернуться к прежнему форматированию

Слайд 10

Класс ios. Манипуляторы

Манипуляторы — это инструкции форматирования, которые вставляются прямо в поток.

Класс ios. Манипуляторы Манипуляторы — это инструкции форматирования, которые вставляются прямо в
Например endl, который посылает символ разделителя строк в поток и сбрасывает буфер.

Слайд 11

Класс ios. Манипуляторы

Следует иметь в виду, что манипуляторы действуют только на те

Класс ios. Манипуляторы Следует иметь в виду, что манипуляторы действуют только на
данные, которые следуют за ними в потоке, а не на те, которые находятся перед ними. На то он и поток.

Слайд 12

Класс ios. Функции

Класс ios содержит набор функций, с помощью которых можно выстав-лять

Класс ios. Функции Класс ios содержит набор функций, с помощью которых можно
флаги форматирования и выполнять некоторые другие действия. Эти функции вызываются для нужных потоковых объектов обычным способом — через точку. Например: cout.width(14); cout.fill('*');

Слайд 13

Класс istream

Класс istream

Слайд 14

Класс istream

Класс istream

Слайд 15

Класс istream

Нам уже встречались некоторые из этих функций, например get(). Большинство из

Класс istream Нам уже встречались некоторые из этих функций, например get(). Большинство
них рассчитаны на работу с объектом cin, обычно представляющим собой поток данных, вводимых с клавиатуры. Последние четыре функции предназначены только для работы с дисковыми файлами.

Слайд 16

Класс ostream

Класс ostream предназначен для вывода (вставки в поток) данных. Как и

Класс ostream Класс ostream предназначен для вывода (вставки в поток) данных. Как
в предыдущем случае, последние четыре функции работают только с файлами.

Слайд 17

Классы iostream и _withassign

Класс iostream является порожденным по отношению к istream и

Классы iostream и _withassign Класс iostream является порожденным по отношению к istream
ostream. Его единственное предназначение — выступать в качестве базового класса для других специфических классов вида iostream_withassign. У него нет собственных методов, кроме конструктора и деструктора. Его порожденные классы могут осуществлять как ввод, так и вывод данных. Существуют три класса вида _withassign:
istream_withassign — наследник istream;
ostream_withassign — наследник ostream;
iostream_withassign — наследник iostream.
Эти классы очень похожи на своих предков. Разница лишь в том, что в них, в отличие от породивших их классов, имеются перегружаемые операции присваивания, благодаря чему их объекты могут быть скопированы.

Слайд 18

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

Использования двух предопределенных потоковых объектов, порожденных классами вида _withassign: cin

Предопределенные потоковые объекты Использования двух предопределенных потоковых объектов, порожденных классами вида _withassign:
и cout мы уже знакомы. Обычно они связаны с клавиатурой и монитором соответственно. Еще двумя предопределенными объектами являются cerr и clog:
cin, объект istream_withassign, используется для операций ввода с клавиатуры;
cout, объект ostream_withassign, используется для операций вывода на экран монитора;
cerr, объект ostream_withassign, используется для сообщений об ошибках;
clog, объект ostream_withassign, используется для ведения журнала.
Объект cerr часто используется для сообщений об ошибках и программной диагностики. Поток, посланный в него, немедленно выводится на экран, минуя буферизацию. Этим cerr отличается от cout. К тому же этот поток не может быть перенаправлен.

Слайд 19

Ошибки потоков. Биты статуса ошибки

Ошибки потоков. Биты статуса ошибки

Слайд 20

Ввод чисел

Обработка ошибки при вводе чисел. При чтении числа с клавиатуры или

Ввод чисел Обработка ошибки при вводе чисел. При чтении числа с клавиатуры
с диска, проверяется значение goodbit, и сообщается об ошиб-ке, если его значение не равно true, и предоставляется возможность пользователю ввести корректное число.

Задача 10-1

Слайд 21

Ввод целого числа и дробного

Задача 10-2

Обработка ошибки при вводе чисел. При чтении

Ввод целого числа и дробного Задача 10-2 Обработка ошибки при вводе чисел.
числа с клавиату-ры или с диска, проверяется значение goodbit, и сообщается об

ошибке, если его значение не равно true, и предостав-ляется возмож-ность пользовате-лю ввести коррект-ное число

Слайд 22

Ввод целого числа и дробного (продолжение)

Задача 10-2

Ввод целого числа и дробного (продолжение) Задача 10-2

Слайд 23

Ввод целого числа и дробного (окончание)

Задача 10-2

Ввод целого числа и дробного (окончание) Задача 10-2

Слайд 24

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

Большинству программ требуется сохранять данные на диске и считывать

Потоковый ввод/вывод дисковых файлов Большинству программ требуется сохранять данные на диске и
их. Работа с дисковыми файлами подразумевает наличие еще одного набора специальных классов: ifstream для ввода и ofstream для вывода. Класс fstream осуществляет и ввод, и вывод.
Форматированный файловый ввод/вывод. При форматирован-ном вводе/выводе числа хранятся на диске в виде серии символов. Таким образом, число 6.02 вместо того, чтобы храниться в виде четырехбайтного значения типа float или восьмибайтного double, хранится в виде последовательности символов '6', '.', '0', '2'.
Символы и строки хранятся в файлах в привычной форме.

Слайд 25

Запись данных

Задача 10-3

Следующая программа демонстрирует запись символа, целого числа, числа типа

Запись данных Задача 10-3 Следующая программа демонстрирует запись символа, целого числа, числа
double и двух объектов типа string в дисковый файл. Вывод на экран не производится.

Слайд 26

Чтение данных

Задача 10-4

Прочитать файл, если он уже создан, можно с использованием

Чтение данных Задача 10-4 Прочитать файл, если он уже создан, можно с
объекта типа ifstream, инициализированного именем файла. Файл автоматически открывается при создании объекта. Затем данные из него можно считать с помощью оператора извлечения (>>).

Слайд 27

Строки с пробелами (запись)

Задача 10-5

Следующая программа выводит строки с пробелами – после

Строки с пробелами (запись) Задача 10-5 Следующая программа выводит строки с пробелами
каждой строки нужно писать специальный символ-ограничитель и использовать функцию getline() вместо оператора извлечения.

Строки стихотворения И. Бродского записаны в файл TEST.TXT

Слайд 28

Строки с пробелами (чтение)

Задача 10-6

Следующая программа считывает строки с пробелами используя функцию

Строки с пробелами (чтение) Задача 10-6 Следующая программа считывает строки с пробелами
getline(), результат чтения затем выводится на экран после считывания каждой строки.

Слайд 29

Определение признака конца файла (EOF)

Итак, объекты порожденных из ios классов содержат флаги

Определение признака конца файла (EOF) Итак, объекты порожденных из ios классов содержат
статуса ошибок, с помощью которых можно проверить результат выполнения операций. При чтении файла условие окончания файла – сигнал EOF.
while(!infile.eof()) // Пока не EOF
Флаги ошибок failbit и badbit тоже могут возникнуть при работе программы, мы изменим условие цикла:
while(infile.good()) // Пока нет ошибок
Можно также проверять поток напрямую.
Запишем еще один вариант цикла while:
while(infile) // Пока нет ошибок

Слайд 30

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

Задача 10-7

Функция put() является методом ostream, может быть использована для ввода

Ввод символов Задача 10-7 Функция put() является методом ostream, может быть использована для ввода единичных символов.
единичных символов.

Слайд 31

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

Задача 10-8а

Функция get() является методом istream, может быть использована для вывода

Вывод символов Задача 10-8а Функция get() является методом istream, может быть использована для вывода единичных символов.
единичных символов.

Слайд 32

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

Задача 10-8в

Есть и другой способ читать символы из файла — использовать

Вывод символов Задача 10-8в Есть и другой способ читать символы из файла
функцию rdbuf() (она является методом класса ios).

Слайд 33

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

Задача 10-9

Массив целых чисел запи-сывается в файл и читает-ся из него.

Двоичный ввод/вывод Задача 10-9 Массив целых чисел запи-сывается в файл и читает-ся
Используются две функции — write() (метод класса ofstream), read() (метод ifstream). Адрес вычислен с исполь-зованием reinterpret_cast относительно типа char*. Второй параметр – длина в байтах.

Слайд 34

Оператор reinterpret_cast

В задаче 10-9 использует оператор reinterpret_ cast для того, чтобы буфер

Оператор reinterpret_cast В задаче 10-9 использует оператор reinterpret_ cast для того, чтобы
данных типа int выглядел для функций read() и write() как буфер типа char.
is.read(reinterpret_cast(buff), MAX*sizeof(int));
reinterpret_cast изменяет тип данных в определенной области памяти, совершенно не задумываясь о том, имеет это смысл или нет. Поэтому вопрос целесообразности использования этого оператора остается целиком на совести программиста.

Слайд 35

Закрытие файлов

До сих пор в наших примерах не нужно было вручную закрывать

Закрытие файлов До сих пор в наших примерах не нужно было вручную
файлы — это делалось автоматически при окончании работы с ними. Соответствующие объекты запускали деструкторы и закрывали ассоциированные файлы. Но в задаче 10-9 оба потока, входной is и выходной os, связаны с одним и тем же файлом EDATA.DAT, поэтому первый поток должен быть закрыт до того, как откроется второй. Для этого используется функция close(). Можно запускать эту функцию каждый раз при закрытии файла, не полагаясь на деструктор потока.

Слайд 36

Объектный ввод/вывод

Так как C++ — это все-таки объектно-ориентированный язык, рассмотрим, как

Объектный ввод/вывод Так как C++ — это все-таки объектно-ориентированный язык, рассмотрим, как
происходит запись объектов в дисковые файлы и чтение из них.

Слайд 37

Запись объекта на диск

Задача 10-10

При записи объекта обычно используем бинарный режим.

Запись объекта на диск Задача 10-10 При записи объекта обычно используем бинарный
В данной программе у пользователя запрашивается информация об объекте класса person, который потом записывается в файл PERSON.DAT.

Слайд 38

Чтение объекта с диска

Задача 10-11

Для чтения используется метод read(). Из файла PERSON.DAT

Чтение объекта с диска Задача 10-11 Для чтения используется метод read(). Из
считывается информация объекта класса person, затем информация выводится на экран.

Слайд 39

Ввод/вывод множества объектов

Задача 10-12

В следующем примере в файл записывается произвольное число объектов.

Ввод/вывод множества объектов Задача 10-12 В следующем примере в файл записывается произвольное
Затем они считы-ваются, и на экран выводится цели-ком содержимое файла.

Слайд 40

Ввод/вывод множества объектов

Задача 10-12

В следующем примере в файл записывается произвольное число объектов.

Ввод/вывод множества объектов Задача 10-12 В следующем примере в файл записывается произвольное
Затем они считываются, и на экран выводится целиком содержимое файла.

Слайд 41

Биты режимов

Биты режимов

Слайд 42

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

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

Указатели файлов У каждого файлового объекта есть два ассоциированных с ним значения,
указатель чтения и указатель записи. Их также называют текущая позиция чтения и текущая позиция записи. Или просто текущая позиция. Функции seekg() и tellg() позволяют устанавливать и проверять текущий указатель чтения, а функции seekp() и tellp()— выполнять те же действия для указателя записи.

Слайд 43

Вычисление сдвига

Задача 10-13

В следующем примере вычисляется количество записей person, по запросу выводится

Вычисление сдвига Задача 10-13 В следующем примере вычисляется количество записей person, по
информация о персоне.

Слайд 44

Реагирование на ошибки

Задача 10-14

Обработка ошибок. Все дисковые опера-ции проверяются после их выполнения

Реагирование на ошибки Задача 10-14 Обработка ошибок. Все дисковые опера-ции проверяются после
Программа открыва-ет выходной потоко-вый объект, записы-вает целый массив целых чисел един-ственным вызовом write() и закрывает объект. Затем откры-вает входной потоко-вый объект и считы-вает массив вызовом функции read().

Слайд 45

Реагирование на ошибки

Задача 10-14

Обработка ошибок. Все дисковые операции проверяются после их выполнения.

Реагирование на ошибки Задача 10-14 Обработка ошибок. Все дисковые операции проверяются после
Программа открывает выходной потоковый объект, записывает целый массив целых чисел единственным вызовом write() и закрывает объект. Затем открывает входной потоковый объект и считывает массив вызовом функции read().

Слайд 46

Как классы записывают и читают сами себя

Статические функции
Одним из способов

Как классы записывают и читают сами себя Статические функции Одним из способов
записать за один сеанс множество объектов является употребление статической функции, которая применяется ко всему классу в целом, а не к отдельным его объектам. Такая функция действительно может записать все объекты сразу. Она обратится к массиву указателей на объекты, который можно хранить в виде статической переменной. При создании каждого объекта его указатель заносится в этот массив. Статический элемент данных также может свято хранить память о том, сколько всего объектов было создано. Статическая функция write() откроет файл, в цикле пройдет по всем ссылкам массива, записывая по очереди все объекты, и после окончания записи закроет файл.

Слайд 47

Как классы записывают и читают сами себя

Размеры порожденных объектов
Объекты, хранящиеся в

Как классы записывают и читают сами себя Размеры порожденных объектов Объекты, хранящиеся
памяти, имеют разные размеры. Класс employee, выступаюший как базовый для классов manager, scientist и laborer. Объекты этих трех порожденных классов имеют разные размеры, так как содержат разные объемы данных.
Пусть имеется массив указателей arrар[], хранящий ссылки на объекты типа employee. Указатели могут ссылаться, таким образом, и на все три порожденных класса. При использовании виртуальных функций можно использовать выражения типа
arrap[]->putdata();
Тогда будет поставлена на исполнение во время работы программы версия putdata(), соответствующая объекту, на который ссылается указатель, а не та, что соответствует базовому классу.

Слайд 48

Как классы записывают и читают сами себя

Использование функции typeid()
Можно использовать ее

Как классы записывают и читают сами себя Использование функции typeid() Можно использовать
для определения класса объекта, подставляя имя этого класса в качестве аргумента sizeof(). Чтобы использовать typeid(), надо включить параметр компилятора RTTI. (это существенно только для компилятора Microsoft Visual C++)
Наш следующий пример показывает, как все вышеописанное работает. Узнав размер объекта, мы можем использовать его в функции write() для записи в файл. К программе 10_15 добавился несложный пользовательский интерфейс. Некоторые специфичес-кие методы сделаны виртуальными, чтобы можно было пользовать-ся массивом указателей на объекты. В программу также включены некоторые приемы обнаружения ошибок. Программа демонстрирует многие приемы, которые могут быть использованы в настоящем приложении для работы с базами данных. Она также показывает реальные возможности ООП.

Слайд 49

Классы записывают и читают сами себя

Задача 10-15

Код программы - начало

Классы записывают и читают сами себя Задача 10-15 Код программы - начало

Слайд 50

Классы записывают и читают сами себя

Код программы – продолжение 1

Задача 10-15

Классы записывают и читают сами себя Код программы – продолжение 1 Задача 10-15

Слайд 51

Классы записывают и читают сами себя

Код программы – продолжение 2

Задача 10-15

Классы записывают и читают сами себя Код программы – продолжение 2 Задача 10-15

Слайд 52

Классы записывают и читают сами себя

Код программы – продолжение 3

Задача 10-15

Классы записывают и читают сами себя Код программы – продолжение 3 Задача 10-15

Слайд 53

Классы записывают и читают сами себя

Код программы – продолжение 4

Задача 10-15

Классы записывают и читают сами себя Код программы – продолжение 4 Задача 10-15

Слайд 54

Классы записывают и читают сами себя

Код программы – конец

Задача 10-15

Классы записывают и читают сами себя Код программы – конец Задача 10-15

Слайд 55

Как классы записывают и читают сами себя

Задача 10-15

Код типа объекта
Мы

Как классы записывают и читают сами себя Задача 10-15 Код типа объекта
умеем определять класс объекта, находящегося в памяти, но как узнать класс объекта, если мы собираемся читать его из файла? Поэтому при записи данных на диск необходимо записывать код (перечисляемую переменную типа employee_type) прямо перед данными объекта. До начала чтения из файла надо прочитать его значение и создать объект соответствующего типа.
aptr_to_obj = new aClass; // arrap[n] = new manager;
И только после этого можно копировать данные из файла в этот новый объект. При корректном способе создания объекта запускается его конструктор. Это необходимо даже тогда, когда вы не определяете собственный, а используете конструктор по умолчанию. Ведь объект — это нечто более глобальное, нежели просто область памяти, в которой хранятся данные. Не забывайте, что это еще и набор методов, некоторые из них вы даже не видите!

Слайд 56

Как классы записывают и читают сами себя

Задача 10-15

Взаимодействие с программой

Как классы записывают и читают сами себя Задача 10-15 Взаимодействие с программой

Слайд 57

Перегрузка операторов извлечения и вставки

Перейдем к изучению следующей темы, связанной с потоками.

Перегрузка операторов извлечения и вставки Перейдем к изучению следующей темы, связанной с
Данный раздел будет посвящен перегрузке операторов извлечения и вставки. Это мощный прием C++, который позволяет поддерживать ввод/вывод пользовательских типов наравне со стандартными, такими, как float и int. Например, если имеется объект класса crawdad, называющийся cd1, его можно вывести на экран простым выражением
cout << "\ncd1 =" << cd1;
Как видите, оно ничем не отличается от подобных конструкций для стандартных типов. Операторы извлечения и вставки могут быть перегружены и для работы с консольным вводом/выводом (с клавиатуры и на экран — cin и cout). С оглядкой, но можно перегрузить их и для работы с дисковыми файлами. Рассмотрим примеры всех этих ситуаций.

Слайд 58

Перегрузка cout и cin

Задача 10-16

Приведем пример, в котором операторы извлечения и

Перегрузка cout и cin Задача 10-16 Приведем пример, в котором операторы извлечения
вставки для класса Distance перегружены для работы с cout и cin.

Слайд 59

Перегрузка << и >> для файлов

Задача 10-17

Следующий пример продемонстрирует, как перегружаются операторы

Перегрузка > для файлов Задача 10-17 Следующий пример продемонстрирует, как перегружаются операторы
<< и >> в классе Distance для работы с файловым вводом/выводом.

Слайд 60

Память как поток

Область памяти можно считать потоком и записывать в нее

Память как поток Область памяти можно считать потоком и записывать в нее
данные точно так же, как в файл. Это требуется, когда нужно выводить дан-ные в определенном формате (например, оставлять только два зна-ка после запятой) и одновременно использовать функцию текстового вывода, которая в качестве аргумента требует строку. Так обычно делают, вызывая функции вывода, при разработке приложений в GUI-средах, например в Windows, поскольку там этим функциям нужно передавать именно строку в качестве аргумента. Программис-ты на C, вероятно, сразу вспомнят, как они использовали sprintf() для этих целей. Семейство потоковых классов поддерживает такое форматирование данных в памяти. Для вывода в память существует специальный класс ostrstream, порожденный классом ostream. Для ввода из памяти служит класс istrstream, порожденный, соответ-ственно, классом istream. Для объектов, которым требуется осу-ществлять одновременно ввод и вывод, создан класс strstream — наследник iostream.

Слайд 61

Память как поток

Задача 10-18

Данный пример показывает, как это реально применить на

Память как поток Задача 10-18 Данный пример показывает, как это реально применить
практике. Создаем бу-фер данных в памяти. За-тем создайте объект ostrstream, используя этот буфер (его адрес и размер) в качестве аргументов конструктора потока. Теперь можно выводить форматированный текст в буфер, как если бы он был потоковым объектом.

Слайд 62

Аргументы командной строки

Если вы использовали когда-нибудь старый добрый MS DOS, вам должно

Аргументы командной строки Если вы использовали когда-нибудь старый добрый MS DOS, вам
быть знакомо понятие аргументов командной строки, использующихся при запуске программ. Их типичное применение — передача имени файла с данными в приложение. Например, вы запускаете программу редактирования текстов и хотите сразу открыть документ, с которым будете работать. Для этого вы пишете: C:\>wordproc afile.doc
Здесь аргументом командной строки является afile.doc. Нам надо каким-то образом заставить программу на C++ распознавать такие обращения.

Слайд 63

Аргументы командной строки

Задача 10-19

Следующая программа, приводимая в качестве примера, считывает и выводит

Аргументы командной строки Задача 10-19 Следующая программа, приводимая в качестве примера, считывает
на экран столько аргументов командной строки, сколько вы сможете напечатать (они отделяются пробелами)

Слайд 64

Список задач 10-го занятия

1. Ввод чисел
2. Ввод целого числа и

Список задач 10-го занятия 1. Ввод чисел 2. Ввод целого числа и
дробного
3. Запись данных
4. Чтение данных
5. Строки с пробелами (запись)
6. Строки с пробелами (чтение)
7. Ввод символов
8. Вывод символов
9. Двоичный ввод/вывод

Слайд 65

Список задач 10-го занятия

10. Запись объекта на диск
11. Чтение объекта с диска
12.

Список задач 10-го занятия 10. Запись объекта на диск 11. Чтение объекта
Ввод/вывод множества объектов
13. Вычисление сдвига
14. Реагирование на ошибки
15. Как классы записывают и читают сами себя
16. Перегрузка cout и cin
17. Перегрузка << и >> для файлов
18. Память как поток
19. Аргументы командной строки

Слайд 66

Резюме 10-го занятия

В этой главе мы ознакомились с иерархией потоковых классов

Резюме 10-го занятия В этой главе мы ознакомились с иерархией потоковых классов
и показали, как обрабатывать различного рода ошибки ввода/вывода. Затем мы рассмотрели некоторые варианты файлового ввода/вывода. Файлы в C++ связаны с объектами различных классов: класс ofstream используется для файлового вывода, ifstream — для ввода, fstream — для ввода и вывода одновременно. Методы этих или базовых классов предназначены для выполнения операций ввода/вывода. Такие операции и функции, как <<, put() и write(), используются для вывода, а >>, get() и read() — для ввода.

Слайд 67

Резюме 10-го занятия

Функции read() и write работают с данными в двоичном

Резюме 10-го занятия Функции read() и write работают с данными в двоичном
режиме. Поэтому можно записывать в файлы объекты целиком, вне зависимости от типов данных, которые они содержат. Могут храниться как отдельные объекты, так и массивы и другие структуры, составленные из множества объектов. Файловый ввод/вывод может обрабатываться с использованием методов. За него могут отвечать как конкретные объекты, так и классы (с помощью статических функций).

Слайд 68

Резюме 10-го занятия

Проверка на наличие ошибок должна осуществляться после выполнения каждой

Резюме 10-го занятия Проверка на наличие ошибок должна осуществляться после выполнения каждой
файловой операции. Сам файловый объект принимает нулевое значение, если возникает какая-либо ошибка. К тому же для определения некоторых видов ошибок используются методы классов. Операции извлечения (>>) и вставки (<<) перегружаются для работы с пользовательскими типами данных. Память может представляться в виде потока, а данные в нее могут посылаться так же, как если бы это был файл.

Слайд 69

Наиболее «популярные» ошибки

Наиболее «популярные» ошибки

Слайд 70

Литература

Роберт Лафоре. Объектно-ориентированное программирование в С++
В. И. Шупляк. С++ Практический курс
В. В.

Литература Роберт Лафоре. Объектно-ориентированное программирование в С++ В. И. Шупляк. С++ Практический
Подбельский. Язык C++. Базовый курс