Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТ...docx
Скачиваний:
12
Добавлен:
21.09.2019
Размер:
695.51 Кб
Скачать

Лабораторные работа 6 Текстовые файлы и потоки ввода/вывода

Цель работы: научиться работать с текстовыми файлами с помощью потоков

ввода/вывода.

Основные теоретические сведения

1. Потоки ввода/вывода

Поток напоминает "канал" или "трубу", через которую данные

поступают от передатчика к приемнику. Исключительно важная особенность

потоковой обработки данных состоит в том, что элементы данных можно

посылать или считывать из потока только по одному за раз, т.е.

последовательно.

Далее рассматриваться будут только однонаправленные потоки, в

которых данные всегда передаются в одном направлении. Из программы

данные можно отправить (записать) в поток вывода, а получить

(прочитать) их в программе из потока ввода. Например, сразу после

запуска программы, поток стандартного ввода "cin" подключается к

клавиатуре, а поток стандартного вывода "cout" – к экрану.

Потоки ввода/вывода, вроде "cin" и "cout", являются примерами

объектов класса "поток". Поэтому изучение потоков полезно и по той

причине, что позволяет ознакомиться с элементами синтаксиса и

некоторыми объектно-ориентированными понятиями Си++.

Список функций для работы с файловыми потоками хранится в

заголовочном файле "fstream.h". Поэтому во всех рассматриваемых ниже

фрагментах программ предполагается, что в начале программы есть

соответствующая директива "#include":

#include<fstream.h>

    1. Создание потоков

В программе перед первым обращением к потоку ввода или вывода

необходимо "создать" поток. Операторы для создания потоков похожи на

описания переменных, и они обычно размещаются в начале программы или

функции рядом с описаниями переменных. Например, операторы:

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" останется на диске, но он

будет пустым.