Работа с файлами произвольного доступа в языке программирования C++

Рассматриваются приемы работы с файлами произвольного доступа. Примеры организации файла произвольного и мгновенного доступа. Средства C++, предназначенные для работы с файловым вводом-выводом. Особенности организации работы с файлом данного типа.

Рубрика Программирование, компьютеры и кибернетика
Вид статья
Язык русский
Дата добавления 20.07.2018
Размер файла 15,5 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Работа с файлами произвольного доступа в языке программирования C++

Дмитриев Владислав Леонидович, кандидат наук, доцент, доцент

Башкирский государственный университет

В статье рассматриваются некоторые приемы работы с файлами произвольного доступа. Использование таких файлов в большинстве практических случаев оказывается более оправдано, чем использование файлов последовательного доступа. Рассмотрены примеры организации файла произвольного и мгновенного доступа.

В C++ каждый файл рассматривается как последовательность байтов и завершается маркером конца файла. Средства C++, предназначенные для работы с файловым вводом-выводом [1, 3-5], основываются на тех же основных определениях классов, что и объекты cin и соut.

При открытии файла создается объект, с которым связывается поток, представляющий собой последовательность байтов. В операциях ввода происходит пересылка байтов от какого-либо устройства (например, клавиатуры) в оперативную память; при выводе же байты пересылаются из оперативной памяти на устройства (например, экран, жесткий диск, принтер, и т.д.). Функции ввода-вывода позволяют выделять из потока и обрабатывать данные различных форматов и размеров, при этом обеспечивая буферизированный как форматированный, так и неформатированный ввод или вывод [1, 2].

При работе с файлами достаточно часто возникает необходимость модифицирования некоторых содержащихся в нем записей. Если мы имеем дело с файлом последовательного доступа, то такое обновление может быть выполнено только посредством использования дополнительного файла, в который будут переписаны данные из исходного файла с учетом необходимой их модификации. В противном случае мы рискуем нарушить другие данные в файле (например, если число символом измененной записи больше числа символов первоначальной записи, то лишние символы будут записаны поверх начала следующей записи в файле). Ясно, что такой метод использования дополнительного файла не всегда приемлем, и его обычно используют лишь в случае обновления многих записей.

В отличие от файлов последовательного доступа, любая из записей файлов произвольного доступа может быть доступна непосредственно, без осуществления поиска среди других записей. При создании файлов произвольного доступа можно использовать различные методы, однако самым простым и распространенным является использование записей с фиксированной длиной. Это дает возможность легко и быстро определять точное расположение любой записи относительно начала файла. Данные, хранящиеся в файле произвольного доступа, могут быть изменены или удалены без перезаписи всего файла; новые данные могут быть вставлены в файл произвольного доступа без нарушения других данных, содержащихся в файле.

Продемонстрируем принципы работы с файлом произвольного доступа. Ниже представлен исходный код программы, которая запрашивает и сохраняет информацию о книге в библиотеке, а также позволяет просмотреть и изменить эту информацию.

#include "stdafx.h"

#include <iostream>

#include <conio.h>

#include <fstream>

#include <stdlib.h>

#include <stdio.h>

using namespace std;

struct Library {int Number;

char Author[30];

char Name[50];

int Year;};

Library Lib;

void add()

{ system("cls"); // clrscr(); - длякомпилятораBorland C++ 5.02

ofstream File_1("c:\\Library.dat",ios::app);

if (!File_1.is_open()) {cerr<<"Нельзяоткрытьфайл!\n";

system("pause"); // или _getch();

exit(1);}

cout<<"Шифркниги: ";

cin>>Lib.Number;

cin.sync();

cout<<"Авторкниги: ";

gets_s(Lib.Author);

cout<<"Названиекниги: ";

gets_s(Lib.Name);

cout<<"Годиздания: ";

cin>>Lib.Year;

File_1.write(reinterpret_cast<const char*>(&Lib),sizeof(Library));

File_1.close();

system("pause"); } // или _getch();

void view()

{ system("cls"); // clrscr(); - длякомпилятораBorland C++ 5.02

ifstream File_1("c:\\Library.dat",ios::in);

if (!File_1.is_open()) {cerr<<"Нельзяоткрытьфайл!\n";

system("pause"); // или _getch();

exit(1);}

while (!File_1.eof())

{ File_1.read(reinterpret_cast<char*>(&Lib),sizeof(Library));

if (!File_1.eof())

{cout<<"Шифркниги: "<<Lib.Number<<endl;

cout<<"Авторкниги: "<<Lib.Author<<endl;

cout<<"Названиекниги: "<<Lib.Name<<endl;

cout<<"Годиздания: "<<Lib.Year<<"\n\n";} }

File_1.close();

system("pause"); } // или _getch();

void changes()

{ int N;

system("cls"); // clrscr(); - длякомпилятораBorland C++ 5.02

ofstream File_1("c:\\Library.dat", ios_base::in | ios_base::out);

if (!File_1.is_open()) {cerr<<"Нельзяоткрытьфайл!\n";

system("pause"); // или _getch();

exit(1);}

cout<<"Укажите номер записи, которую хотите изменить: ";

cin>>N;

File_1.seekp((N-1)*sizeof(Library));

cout<<"Шифркниги: ";

cin>>Lib.Number;

cin.sync();

cout<<"Авторкниги: ";

gets_s(Lib.Author);

cout<<"Названиекниги: ";

gets_s(Lib.Name);

cout<<"Годиздания: ";

cin>>Lib.Year;

File_1.write(reinterpret_cast<const char*>(&Lib),sizeof(Library));

File_1.close();

system("pause"); } // или _getch();

void Menu()

{ char Ch=13;

while (Ch!=27)

{ system("cls"); // clrscr(); - длякомпилятораBorland C++ 5.02

cout<<" ### МЕНЮ ###\n";

cout<<"1. Добавление записи в файл.\n";

cout<<"2. Чтение всех записей из файла.\n";

cout<<"3. Изменение записи по шифру.\n";

cout<<"4. Завершение работы.\n";

Ch=_getch();

switch (Ch) { case 49: add(); break;

case 50: view(); break;

case 51: changes(); break;

case 52: Ch=27; } } }

intmain()

{ setlocale(LC_ALL,"Rus");

Menu();

system("pause"); return 0; }

Функция-член write() класса ostream выводит в заданный поток фиксированное число байт, начиная с указанного места в памяти. Если поток связан с файлом, то данные записываются, начиная с позиции в файле, определяемой функцией позиционирования указателя файла seekp. Так, в приведенной программе - это строка

File_1.seekp((N-1)*sizeof(Library));

Функция-член read() класса istream вводит из заданного потока в область памяти фиксированное число байт, начиная с указанного адреса. Если поток связан с файлом, то данные вводятся, начиная с позиции в файле, определяемой функцией позиционирования указателя файла seekg.

Тук как функция write() должна получать первый аргумент типа const char*, то в приведенном выше примере использован оператор

reinterpret_cast<constchar*>

для преобразования адреса Lib в указатель const char*. Второй аргумент функции write() есть целое, и определяет число байт, которые должны быть записаны. Для функции read() сказанное также справедливо.

Однако представленный выше способ создания файла произвольного доступа не удобен для осуществления так называемого "немедленного доступа", который может потребоваться, например, в банковских системах для быстрой проверки состояния счета (описанный способ хранения данных при проверке состояния счета, в общем случае, потребует перебора и проверки большого количества данных). Если организовать хранение данных в файле произвольного доступа таким образом, что местоположение любой записи относительно начала файла представляется как функция от размера записи и ключа записи, то можно будет получать "немедленный доступ" к любой записи. Но стоит сразу сказать, что создаваемый таким образом файл может оказаться сильно разреженным, что приводит к нерациональному расходу памяти на диске.

Описанный способ создания такого файла представлен в примере ниже; файл может содержать информацию о любом количестве клиентов банка с различными номерами счетов. При добавлении нового клиента, в зависимости от номера счета, ему отводится соответствующая позиция в файле.

#include <iostream>

#include <conio.h>

#include <fstream>

#include <stdlib.h>

#include <stdio.h>

using namespace std;

struct {long int Account;

char Name[50];} Bank;

longintN;

boolinspection() //Проверяет наличие номера счета в файле

{ ifstream File_1("c:\\Bank.dat",ios::in);

if (!File_1.is_open())

{cerr<<"Файлненайден! Созданновыйфайл.\n";

ofstream File_2("c:\\Bank.dat",ios::out);

File_2.close();

cout<<"Номерсчета: ";

cin>>N;

return false;}

cout<<"Номерсчета: ";

cin>>N;

File_1.seekg((N-1)*sizeof(Bank));

File_1.read(reinterpret_cast<char*>(&Bank),sizeof(Bank));

File_1.close();

if (Bank.Account==N)

{cout<<"Такой счет уже существует!\n";

system("pause");

return true;}

else return false;}

voidadd() //Добавление информации о новом клиенте

{ system("cls");

if (!inspection())

{ ofstream File_1("c:\\Bank.dat", ios_base::in | ios_base::out);

if (!File_1.is_open()) {cerr<<"Нельзяоткрытьфайл!";

system("pause");

exit(1);}

Bank.Account=N;

cout<<"ФИОклиента: ";

gets_s(Bank.Name);

File_1.seekp((Bank.Account-1)*sizeof(Bank));

File_1.write(reinterpret_cast<const char*>(&Bank),sizeof(Bank));

File_1.close();

system("pause"); } }

void view(int a)

{ system("cls");

ifstream File_1("c:\\Bank.dat",ios::in);

if (!File_1.is_open()) {cerr<<"Нельзяоткрытьфайл!";

system("pause");

exit(1);}

if (a==0) while (!File_1.eof())

{ File_1.read(reinterpret_cast<char*>(&Bank),sizeof(Bank));

if (Bank.Account!=0 && !File_1.eof())

{cout<<"Номерсчета: "<<Bank.Account<<endl;

cout<<"ФИОклиента: "<<Bank.Name<<endl<<"\n\n";} }

if (a==1) {cout<<"Укажите номер счета: ";

cin>>N;

File_1.seekg((N-1)*sizeof(Bank));

File_1.read(reinterpret_cast<char*>(&Bank),sizeof(Bank));

if (Bank.Account!=0 && !File_1.eof())

{cout<<"Номерсчета: "<<Bank.Account<<endl;

cout<<"ФИОклиента: "<<Bank.Name<<endl<<"\n\n";}

elsecout<<"Нет такого номера счета!\n"; }

File_1.close();

system("pause"); }

void Menu()

{ charCh=13;

while (Ch!=27)

{ system("cls");

cout<<" ### МЕНЮ ###\n";

cout<<"1. Добавление информации о клиенте.\n";

cout<<"2. Информация о всех клиентах банка.\n";

cout<<"3. Информация о клиенте по номеру счета.\n";

cout<<"4. Завершение работы.\n";

Ch=_getch();

switch (Ch) { case 49: add(); break;

case 50: view(0); break; //информация о всех клиентах

case 51: view(1); break; //... о конкретном клиенте

case 52: Ch=27; } } }

int main()

{ setlocale(LC_ALL,"Rus");

Menu();

system("pause"); return 0; }

Список литературы

файл произвольный доступ программирование

1. Дмитриев В.Л. Теория и практика программирования на С++. - Стерлитамак: РИО СФ БашГУ, 2013. - 308 с.

2. Дмитриев В.Л. О некоторых методах класса istream в языке программирования C++ // NovaInfo.Ru - 2016. - № 57. - URL: http://novainfo.ru/article/9709

3. Прата С. Язык программирования С++. Лекции и упражнения, 5-е изд.: Пер. с англ. - М.: Вильямс, 2007. - 1184 с.

4. Страуструп Б. Язык программирования С++. Специальное издание. - М.: Бином, 2004. - 1054 с.

5. Stroustrup Bjarne. The C++ programming language / Bjarne Stroustrup. - Fourth edition. - Boston: Addison-Wesley, 2013. - 1368 p.

Размещено на Allbest.ru

...

Подобные документы

  • Анализ методов и средств контроля доступа к файлам. Проблемы безопасности работы с файлами, средства контроля доступа ним. Идеология построения интерфейса, требования к архитектуре. Работа классов системы. Оценка себестоимости программного продукта.

    дипломная работа [2,5 M], добавлен 21.12.2012

  • Принципы создания последовательных и файлов произвольного доступа. Формирование файлов, в одном из которых помещены фамилии пяти знакомых, а в другой номера их телефонов. Составление программы, которая по фамилии знакомого определяет номер его телефона.

    контрольная работа [17,9 K], добавлен 25.12.2010

  • Процедуры и функции языка Pascal для работы с файлами прямого и последовательно доступа. Формат и структура в файлах прямого доступа. Возможность ввода данных с клавиатуры либо из файла. Контроль вводимых данных. Листинг программы и ее экранные формы.

    лабораторная работа [48,7 K], добавлен 13.02.2009

  • Файл - именованная область внешней памяти ПК. Процедуры и функции языка Pascal для работы с файлами прямого и последовательного доступа. Классификация файлов по типу доступа к элементам. Обоснование выбора средств программной реализации блоков.

    лабораторная работа [10,4 K], добавлен 13.02.2009

  • Принципы и порядок работы с файлами на языке Delphi, получение навыков программирования с использованием файлов. Создание каталога продуктов. Страница палитры компонентов, настраиваемые компоненты и их значения. Текст программы и ее тестирование.

    лабораторная работа [243,9 K], добавлен 09.01.2009

  • Создание приложения Windows, позволяющего автоматизировать процесс обработки информации студентов университета. Организация работы с физическими файлами в языках программирования. Изучение средств IDE Delphi для организации работы с текстовыми файлами.

    курсовая работа [1,5 M], добавлен 08.11.2011

  • Средства языка программирования Delphi. Структурные типы данных. Строковые переменные, массивы, множества, файлы. Механизм классов в C++. Интерфейсный и описательный обзоры классов в Delphi. Работа с текстовыми и бинарными файлами прямого доступа.

    курсовая работа [990,4 K], добавлен 07.08.2012

  • Теоретическое изучение и практическое применение приёмов работы с файлами в операционной системе Windows 95. Файлы и папки: основные понятия и правила формирования имен файлов в Windows. Характеристика и анализ особенностей операций с файлами и папками.

    контрольная работа [139,9 K], добавлен 09.03.2011

  • Классификация и характеристика сетей доступа. Технология сетей коллективного доступа. Выбор технологии широкополосного доступа. Факторы, влияющие на параметры качества ADSL. Способы конфигурации абонентского доступа. Основные компоненты DSL соединения.

    дипломная работа [1,6 M], добавлен 26.09.2014

  • Схематическое представление памяти компьютера в виде последовательности ячеек. Оперативная память как быстро запоминающее устройство не очень большого объема. Кэш-память - высокоскоростная память произвольного доступа. Использование графической платы.

    реферат [21,6 K], добавлен 27.01.2011

  • Цели и задачи дисциплины "Технология программирования". Программные средства ПК. Состав системы программирования и элементы языка. Введение в систему программирования и операторы языка Си. Организация работы с файлами. Особенности программирования на С++.

    методичка [126,3 K], добавлен 07.12.2011

  • Проверка существования и статуса файла. Определение его размера. Открытие файла для чтения, записи, добавления. Закрытие файловых дескрипторов. Запись из переменной в файл. Загрузка файла из сети. Создание и удаление каталога. Функции работы с каталогами.

    презентация [133,9 K], добавлен 21.06.2014

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

    курсовая работа [38,2 K], добавлен 14.10.2011

  • Изучение сущности и основных задач файловой системы. Принципы работы с папками и файлами. Комплекс системных программных средств, реализующих управление файлами: создание, уничтожение, чтение, запись, именование, поиск и другие операции над файлами.

    курсовая работа [309,6 K], добавлен 11.11.2013

  • Область использования телекоммуникационной технологии. Целесообразность применения WiMAX как технологии доступа, фиксированный и мобильный вариант. Особенности широкополосного доступа, пользовательское оборудование. Режимы работы, MAC-канальный уровень.

    контрольная работа [47,0 K], добавлен 22.11.2011

  • Алгоритм и код программы для создания исходного двоичного файла чисел с произвольным количеством элементов, чтения из файла действительных восьмибайтных элементов и подсчёта общего количества элементов файла. Вывод результата работы программы на экран.

    контрольная работа [1,0 M], добавлен 23.11.2014

  • Значение астрофизических исследований. Международные космические проекты. Инфокоммуникационные технологии удаленного доступа к компьютеру. Основные возможности и достоинства Team Viewer. Порядок работы с астрофизическим комплексом в реальном времени.

    дипломная работа [4,8 M], добавлен 12.11.2013

  • Организация доступа в Интернет на основе оптических технологий в сетях доступа. Технологии построения городских сетей Интернет-доступа на основе коммутаторов Ethernet второго и третьего уровня. Основные преимущества оптических технологий в сетях доступа.

    презентация [135,5 K], добавлен 14.09.2013

  • Изучение инструментария для работы с pdf-файлами. iTextSharp – инструмент, имеющий много функций для полноценного контроля PDF. Visual Studio - линейка продуктов компании Майкрософт, включающих интегрированную среду разработки программного обеспечения.

    контрольная работа [394,6 K], добавлен 12.09.2012

  • Работа с элементом управления в VB.net. Работа с файлами, организация последовательного доступа с помощью объектов Streareader и Streamwriter. Последовательный доступ с помощью класса File, программирование задач с использованием циклов с параметром.

    лабораторная работа [644,8 K], добавлен 27.12.2013

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.