Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛекцииЯзыки прогрИб.doc
Скачиваний:
27
Добавлен:
12.11.2019
Размер:
922.11 Кб
Скачать

Тема 12. Обработка файлов данных

12.1. Записи и файлы данных

Хранение данных в переменных, массивах и структурах является временным. Файлы предназначены для постоянного хранения больших объемов данных на дисках.

Бит - наименьший элемент данных в компьютере, который может принимать значение 0 либо 1.

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

Поле – это группа символов (или байтов), имеющая некоторый смысл.

Запись – это группа связных полей. Одно из полей записи выбирается в качестве ее ключа для идентификации записи.

Файл – это группа связных записей.

Совокупность программ, предназначенных для создания баз данных и управления ими, называется системой управления базой данных - СУБД.

Виды хранимых данных файла:

  • - файлы с непрерывной последовательностью символов,

  • - файлы из строк символов переменной длины,

  • - файлы из форматированных данных разного типа с разделителями (пробелами),

  • - файлы из записей фиксированной длины состоят из компонент типа структура.

12.2. Операции и средства обработки файлов

Язык C++ не имеет встроенных в язык средств файлового ввода/вывода. Для этого используются библиотеки ввода/вывода. Настоятельно рекомендуем пользоваться базовой библиотекой потокового ввода/вывода iostream C++, как наиболее гибкой и удобной по сравнению с другими библиотеками, например, с stdio.

Потоком называется абстрактное понятие, относящееся к переносу данных от источника к приемнику. Имя потока используется в операциях записи и чтения файла. Файл - это поименованная совокупность данных, хранящаяся на внешнем носителе.

Основными этапами (операциями) обработки файлов являются:

  • открытие потока;

  • связывание потока с файлом;

  • запись и чтение данных файла;

  • закрытие файла.

Существуют предопределенные потоки, для которых не нужны операции открытия потока и связывания его с файлом: cin - стандартный поток ввода данных (файл - клавиатура); cout - стандартный поток вывода данных(файл -экран дисплея); cerr- стандартный поток вывода ошибок; буферизируется поблочно, очистка буфера производится при каждой новой вставке; clog - полностью буферизированная версия cerr.

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

#include <iostream> и

#include <fstream>.

Открытие потока заключается в объявлении идентификатора потока и по умолчанию режима открытия (ввод, вывод, ввод и вывод).

- Синтаксис оператора открытия потока:

ifstream p; //открытие потока p на чтение (ввод)

ofstream p; //открытие потока p на запись (вывод)

fstream p; //открытие потока p на чтение и запись

Связывание потока с файлом заключается в назначении открытому ранее потоку конкретного файла на диске, а также в возможности установления дополнительных режимов потока.

- Синтаксис оператора связывания:

p.open(imfile[,<режим 1>|<режим 2>...]); ,где p - имя открытого ранее потока, imfile - имя файла на диске, <режим1>- символическая константа режима открытия файла. Символические константы режимов открытия файла следующие:

ios::in - открытие файла на чтение (ввод);

ios::out - открытие файла на запись (вывод);

ios::app - добавление данных в конец файла;

ios::ate - перемотка к концу файла;

ios::trunc - сжатие файла до нуля (очистка содержимого);

ios::nocreate - если файл не существует, то ошибка;

ios::noreplace - если файл существует, то ошибка;

ios::binary - открытие в двоичном режиме (по умолчанию -

текстовый).

Пример:

ofstrem f1; //первый этап - открытие потока f1

f1.open ("karta.dat", ios::app|ios::binary); //второй этап

Открытый ранее поток f1 связывается с файлом "karta.dat" и открывается на добавление данных в конец файла в двоичном режиме.

Раздельное выполнение операций открытия и связывания позволяет открывать поток только один раз и связывать этот поток с различными файлами.

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

- Синтаксис оператора открытия и связывания потока:

ifstream p(imfile[,<режим 1>|<режим 2>...]);

ofstream p(imfile[,<режим 1>|<режим 2>...]);

fstream p(imfile[,<режим 1>|<режим 2>...]);

Пример:

ofstrem f1("karta.dat",ios::app|ios::binary);

Выбор средств для операций чтения/записи определяется видом хранимых данных файла:

- Файлы с непрерывной последовательностью символов используют для записи символа в файл операцию вставки(<<) или функцию put , для чтения символа - операцию извлечения(>>) или функцию get.

Примеры:

p<<ch;//запись символа, p-имя потока, ch-переменная типа char

p.put(ch); //альтернатива операции <<

p>>ch; //чтение символа

p.get(ch); //get с параметром ch=p.get();//get без параметра

- Файлы из строк символов переменной длины используют для записи строки в файл операцию << или функцию write, для чтения строки - операцию >> или функции read или get-строка.

Примеры:

p<<str;//запись строки, str - переменная типа массив char

p.write(str,n);//альтернатива <<, n- кол-во записыв. символов

p>>str; //чтение строки до разделителя (пробел,'\n')

p.get(str,n); //альтернатива >>, n- кол-во читаемых символов

p.read(str,n);

- Файлы из форматированных данных разного типа с разделителями (пробелами) могут использовать для записи и чтения данных операции << и >>, при этом происходят преобразования данных.

- Файлы из записей фиксированной длины состоят из компонент типа структура и могут использовать для записи и чтения целой структуры функции write и read.

Для решения задач информационных систем наиболее приемлемым является вид хранимых данных файла - запись фиксированной длины. Файлы данных являются не текстовыми файлами, и поэтому, предпочтителен двоичный режим записи/чтения (ios::binary), так называемый неформатированный ввод/вывод данных, т.е. без преобразований из двоичного представления в символьный и обратно. Для реализации операций записи и чтения таких данных используем функции write и read.

- Синтаксис операции записи:

p.write((char *)&zap,sizeof(zap)); ,где p - идентификатор потока, zap - переменная типа струк­тура, & - операция адресации, sizeof(zap) - размер переменной zap в байтах.

- Синтаксис операции чтения:

p.read((char *)&zap,sizeof(zap));

- Синтаксис оператора закрытия файла:

p.close( );//закрывается файл,связанный потоком p.

Для организации прямого доступа к записям файла используются функции seekg и seekp.

- Синтаксис функций установки указателей чтения и записи файла на n байт от точки отсчета:

p.seekg((long)n, <точка отсчета>); //указатель чтения

p.seekp((long)n,<точка отсчета>);//указатель записи

Точки отсчета следующие: ios::beg - начало файла, ios::end - конец файла, ios::cur - текущая позиция указателя.

-Синтаксис функций определения текущей позиции указателей:

streampos m=p.tellg; //m - позиция указателя чтения

streampos m=p.tellp; //m - позиция указателя записи ,где streampos -тип,определенный в библиотеке с помощью typedef, как тип long.