Класс двоичного файла, производный от fstream

 

Оглавление


1. Описание задания

. Структурное описание разработки

. Функциональное описание разработки

. Описание интерфейса программы

. Контрольные примеры

Выводы

Список использованной литературы

Приложение А. Файл «MyClass.h»

Приложение Б. Файл «courses.cpp»



1. Описание задания


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

Вариант 4.2.

Класс - двоичный файл, производный от fstream. Файл содержит односвязный список строк в формате записей переменной длины со счетчиком. Формат файла: в начале файла - заголовок списка. Элемент списка содержит файловый указатель на следующий и саму строку в виде записи переменной длины.


2. Структурное описание разработки

двоичный файл программа редактор

Для реализации поставленной задачи был разработан новый класс «bin_file».

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

На данном рисунке представлена внутренняя структура двоичного файла.


В начале файла расположен заголовок (по умолчанию bin) занимающий 3 байта. За ним идет файловый указатель Next (4 байта), указывающий на следующий элемент списка, если такого не имеется он равен 0, текущий элемент является последним. За Next так же следует целочисленное значение задающее длину строки содержащейся в элементе. Последней расположена сама строка.

Для временного хранения обрабатываемого элемента списка, в класс были добавлены такие поля как:

private:next;length;

char *str;

Они используются методами класса bin_file, которые изложены в «функциональном описании».


3. Функциональное описание разработки


Начнем функциональное описание с конструктора класса bin_file.

bin_file(const char *name,int p):basic_fstream(name, ios::in | ios::out | ios::binary){//p=0: новый файл p=1: использовать готовыйi=0;(p==0){(name_list,strlen(name_list));

write((char *)&i,4); //указатель на след

write((char *)&i,4);//длина 1строки

}

cout<<"Open.\n";

};

В качестве входных аргументов конструктор принимает 2 значения. Указатель на строку с именем нужного файла const char *name , который передается в коснcтруктор базового класса fstream. И целочисленное значение int p , этот параметр равен 0, если пользователь хочет создать новый двоичный файл и в него нужно записать заголовок и начальные данные, значение принимает 1, если собирается воспользоваться готовым файлом, и все что нужно сделать это связать поток ввода-вывода с двоичным файлом.

Конструктор без параметров:_file():basic_fstream(){};

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

Далее, функция bin_file::set_elem(char *_str);

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

Пожалуй самый важный элемент класса bin_file, который и создает структуру такой какая она есть, метод:add_elem();

Первое, что происходит, это установка позиции для чтения в файле(7,ios::beg); Она устанавливается для чтения длины первого элемента списка(заголовок 3 байта + указатель на следующий 4 байта = 7 байт). Если после прочтения длина первого элемента оказалась равной 0, приходим к выводу, что список пуст, и добавлять нужно первый элемент. (first_lng==0){ //список пуст(3,ios::beg);//первый эл-т((char *)&next,4);//файловый указатель на след элем

write((char *)&length,4);//длина строки(str,length);//строка

}

В противном случае, в списке уже существуют элементы. Тут добавление происходит сложнее, изначально нужно добраться до последнего элемента списка.

Двигаемся по структуре и считываем каждый элемент, пока не находим с нулевым указателем. {((char *)&_next,4);//указ на след((char *)&_length,4);//указ на след_pos=tellp();//тек позиция

if(_next==0){

/********************************************/;

}(_next);

}while(1);

Оказавшись в нужном месте, первое, что происходит - перемещение позиции чтения файла на Next последнего элемента. Изменяя это значение с 0 на 4+4+Length от текущей позиции, что соответствует концу двоичного файла. Затем переходим в только что установленную позицию, и записываем туда новый элемент списка.


На этом добавление завершается.

Метод:show_list();

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

Метод:add_txtfile(char * name_file);

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

Метод:create_txtfile(char *name_file);

аналогичен предыдущему. Только считывается теперь структура двоичного файла, и последовательно записывается каждый элемент списка(в данном случае слова) в текстовый файл.

. Описание интерфейса программы

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



Для вызова пункта меню, нужно ввести его номер.

При успешном соединении с двоичным файлом, программа сообщает о этом(пункты 1,2).


Пример добавления нескольких строк и вывод их на экран(п.3,п.3,п.4).



5. Контрольные примеры


Для проверки скорости выполнения операций, добавим к существующему списку из двух элементов текстовый файл.

Добавление текстового файла из 300 слов: 2823 миллисекунд.

Как мы можем увидеть, уже с 300 элементов добавление выполняется очень долго, это связанно с постоянным обращением к жесткому диску для записи элемента, а также нахождению места для записи.


Выводы


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

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

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



Список использованной литературы


Р. Лафоре «Объектно-ориентированное программирование в C++»

«Питер.»



Приложение А. Файл «MyClass.h»


#include <iostream>

#include <fstream>namespace std;

//const int L_NAME=20;bin_file : public std::fstream{:next;length;*str;:char *name_list;set_elem(char *_str);add_elem();show_list();add_txtfile(char * name_file);create_txtfile(char *name_file);_file():basic_fstream(){};_file(const char *name,int p):basic_fstream(name, ios::in | ios::out | ios::binary){//p=0: новый файл p=1: использовать готовыйi=0;(p==0){(name_list,strlen(name_list));

write((char *)&i,4); //указатель на след

write((char *)&i,4);//длина 1строки

}<<"Open.\n";

};

};bin_file::set_elem(char *_str){=strlen(_str);// =0;=_strdup(_str);

};bin_file::add_elem(){

seekp(7,ios::beg);//длина первого эл-та

int first_lng=0;((char *)&first_lng,4);(first_lng==0){ //список пуст(3,ios::beg);//первый эл-т

write((char *)&next,4);//файловый указатель на след элем

write((char *)&length,4);//длина строки(str,length);//строка

}else{(3,ios::beg);_next;_length;{((char *)&_next,4);//указ на след((char *)&_length,4);//указ на след_pos=tellp();//тек позиция(_next==0){

seekp(_pos-8,ios::beg);//позиция на указатель

int tmp_point=_pos+_length;

write((char *)&tmp_point,4);//пишем адрес позиции следующего(tmp_point,ios::beg);//указ на записываемый эл-т((char *)&next,4);//файловый указатель на след элем

write((char *)&length,4);//длина строки(str,length);//строка;

}(_next);

}while(1);

}

};bin_file::show_list(){_next;_length;*strout;(3,ios::beg);//заголовок{((char *)&_next,4);//next((char *)&_length,4);=new char[_length];(strout,_length);<<"Elem: ";(int _i=0;_i<_length;_i++)<<strout[_i];<<"->"<<endl; (_next);

} while(_next!=0);


};bin_file::add_txtfile(char *name_file){mystr(name_file);(!out){ //проверка создания файла<< "Cannot open file. " << endl; ;

}_k=0;word[64];(!mystr.eof()){>>word;_elem(word);_elem();

}

};bin_file::create_txtfile(char *name_file){out(name_file);(!out){ //проверка создания файла<< "Cannot create file. " << endl; ;

}_next;_length;*strout;(3,ios::beg);//заголовок{((char *)&_next,4);//next((char *)&_length,4);=new char[_length];(strout,_length);[_length]='\0';

//for(int _i=0;_i<_length;_i++)<<strout<<" ";(_next);

} while(_next!=0);

};


Приложение Б. Файл «courses.cpp»


#include "stdafx.h"

#include "MyClass.h"

#include <conio.h>

#include <time.h>* bin_file::name_list="bin";_tmain(int argc, _TCHAR* argv[])

{_file *file;{(1){<<"Menu: \n";<<"1) Connect new.\n";<<"2) Connect complite.\n";<<"3) Add element.\n";<<"4) Show list. \n";<<"5) Add txt file. \n";<<"6) Create txt file.\n";<<"Esc for exit.\n";(_getch()){'1'://connect=new bin_file("test.bin",0);(!file) 1;<<"File connect.\n";;'2':=new bin_file("test.bin",1);(!file) 1;<<"File connect.\n";;'3':_ch[20];<<"String: ";>>_ch;>set_elem(_ch);>add_elem();;'4':>show_list();;'5':

{t1=clock();>add_txtfile("file.txt");t2=clock();<<"Complite. \n"<<t2-t1;};'6':>create_txtfile("out_file.txt");<<"Complite.\n";;27: //exit

return 0;

}

}

}(int)

{cerr<<"File not found.\n";};

_getch();return 0; }


Оглавление 1. Описание задания . Структурное описание разработки . Функциональное описание разработки . Описание интерфейса программы . Контр

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ