- •Задание:
- •Задание:
- •Лабораторная работа 4 Переменные, типы данных и выражения
- •1. Идентификаторы
- •2. Типы данных
- •2.2 Вещественные числа
- •2.3 Преобразование типов в выражениях
- •2.4 Символьный тип
- •2.5 Символьные строки
- •2.6 Типы данных, определяемые пользователем
- •3. Вывод вещественных чисел на экран
- •4. Описания, константы и перечисления
- •4.1 Тип "Перечисление"
- •4.2 Расположение описаний констант и переменных в исходном тексте
- •5. Присваивание и выражения
- •5.1 Краткая форма записи операторов присваивания
- •5.2 Логические выражения и операторы
- •6. Сводка результатов
- •Лабораторная работа 5 Функции и процедурная абстракция
- •1. Назначение подпрограмм
- •2. Определение новых функций
- •3. Способы передачи параметров внутрь функций
- •3.1 Передача параметров по значению
- •3.2 Передача параметров по ссылке
- •4. Полиморфизм и перегрузка функций
- •5. Процедурная абстракция и "хороший" стиль программирования
- •6. Модульное программирование
- •Лабораторные работа 6 Текстовые файлы и потоки ввода/вывода
- •1. Потоки ввода/вывода
- •Создание потоков
- •1.2 Подключение и отключение потоков от файлов
- •2. Проверка ошибок выполнения файловых операций
- •3. Символьный ввод/вывод
- •3.1 Функция ввода "get(...)"
- •3.2 Функция вывода "put(...)"
- •3.3 Функция "putback(...)"
- •4. Проверка достижения конца файла при операциях ввода
- •4.1 Проверка конца файла с помощью функции "eof()"
- •5. Передача потоков функциям в качестве параметров
- •Лабораторные работа 7 Операторы ветвления и циклы
- •1. Логические значения, выражения и функции
- •2. Циклы "for", "while" и "do...While"
- •3. Множественное ветвление и оператор "switch"
- •4. Блоки и область видимости переменных
- •5. Замечание о вложенных циклах
- •6. Сводка результатов
- •Задание:
- •Лабораторные работа 8 Массивы и символьные строки
- •1. Назначение массивов
- •1.1 Объявление массивов
- •1.2 Использование элементов массивов в выражениях
- •2. Передача массивов в качестве параметров функций
- •3. Сортировка массивов
- •4. Двумерные массивы
- •5. Символьные строки
- •5.2 Объявление и инициализация символьных строк
- •5.3 Библиотечные функции для работы с символьными строками
- •5.4 Чтение символьных строк из потока ввода с помощью функции "getline(...)"
- •6. Сводка результатов
Лабораторные работа 6 Текстовые файлы и потоки ввода/вывода
Цель работы: научиться работать с текстовыми файлами с помощью потоков
ввода/вывода.
Основные теоретические сведения
1. Потоки ввода/вывода
Поток напоминает "канал" или "трубу", через которую данные
поступают от передатчика к приемнику. Исключительно важная особенность
потоковой обработки данных состоит в том, что элементы данных можно
посылать или считывать из потока только по одному за раз, т.е.
последовательно.
Далее рассматриваться будут только однонаправленные потоки, в
которых данные всегда передаются в одном направлении. Из программы
данные можно отправить (записать) в поток вывода, а получить
(прочитать) их в программе из потока ввода. Например, сразу после
запуска программы, поток стандартного ввода "cin" подключается к
клавиатуре, а поток стандартного вывода "cout" – к экрану.
Потоки ввода/вывода, вроде "cin" и "cout", являются примерами
объектов класса "поток". Поэтому изучение потоков полезно и по той
причине, что позволяет ознакомиться с элементами синтаксиса и
некоторыми объектно-ориентированными понятиями Си++.
Список функций для работы с файловыми потоками хранится в
заголовочном файле "fstream.h". Поэтому во всех рассматриваемых ниже
фрагментах программ предполагается, что в начале программы есть
соответствующая директива "#include":
#include<fstream.h>
Создание потоков
В программе перед первым обращением к потоку ввода или вывода
необходимо "создать" поток. Операторы для создания потоков похожи на
описания переменных, и они обычно размещаются в начале программы или
функции рядом с описаниями переменных. Например, операторы:
ifstream in_stream;
ofstream out_stream;
создают поток с именем "in_stream", являющийся объектом класса (как типа
данных) "ifstream" (input-file-stream, файловый поток ввода), и поток с
именем "out_stream", являющийся объектом класса "ofstream" (output-filestream,
файловый поток вывода). Аналогию между потоками и обычными
переменными (типа "int", "char" и т.д.) не следует понимать слишком
буквально. Например, к потокам нельзя применять оператор присваивания
(например, нельзя записать "in_stream1 = in_stream2").
1.2 Подключение и отключение потоков от файлов
После создания потока его можно подключить к файлу (открыть файл)
с помощью функции-члена "open(...)". (В предыдущих лекциях уже
использовались несколько функций-членов потоков вывода. Например, во
2-й лекции применялись "precision(...)" и "width(...)".) Функция "open(...)" у
потоков ifstream и ofstream работает по-разному (т.е. это полиморфная
функция).
Для подключения потока ifstream с именем "in_stream" к текстовому
файлу с например с именем "Lab_6.txt" надо применить следующий вызов:
in_stream.open("Lab_6.txt");
Этот оператор подключит поток "in_stream" к началу файла
"Lab_6.txt".
Чтобы к файлу "Lab_6.txt" подключить поток вывода ofstream с
именем "out_stream", надо выполнить аналогичный оператор:
out_stream.open("Lab_6.txt");
Этот оператор подключит поток "out_stream" к файлу "Lab_6.txt", но
при этом прежнее содержимое файла будет удалено. Файл будет
подготовлен к приему новых данных
Для отключения потока "in_stream" от файла, к которому он
подключен (для закрытия файла), надо вызвать функцию-член "close()":
in_stream.close();
Функция-член отключения от файла у потока вывода:
out_stream.close();
выполняет аналогичные действия, но, дополнительно, в конец файла
добавляется служебный символ "end-of-file (маркер конца файла)". Т.о.,
даже если в поток вывода не записывались никакие данных, то после
отключения потока "out_stream" в файле "Lab_6.txt" будет один служебный
символ (рис. 2). В таком случае файл "Lab_6.txt" останется на диске, но он
будет пустым.