Класс двоичного файла, производный от fstream
Разработка программы, представляющей собой простой текстовый редактор, использующий структуру данных для промежуточного хранения редактируемого файла. Функциональное описание разработки. Внутренняя структура двоичного файла нового класса "bin_file".
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 26.01.2013 |
Размер файла | 254,6 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru
Размещено на http://www.allbest.ru
Оглавление
1. Описание задания
2. Структурное описание разработки
3. Функциональное описание разработки
4. Описание интерфейса программы
5. Контрольные примеры
Выводы
Список использованной литературы
Приложение А. Файл «MyClass.h»
Приложение Б. Файл «courses.cpp»
1. Описание задания
Класс двоичного файла, производный от fstream. Двоичный файл содержит заданную структуру данных. Программа должна представлять собой простой текстовый редактор, использующий структуру данных для промежуточного хранения редактируемого файла. Должны быть реализованы операции создания и заполнения двоичного файла из заданного текстового и сохранения содержимого двоичного файла в текстовом.
Вариант 4.2.
Класс - двоичный файл, производный от fstream. Файл содержит односвязный список строк в формате записей переменной длины со счетчиком. Формат файла: в начале файла - заголовок списка. Элемент списка содержит файловый указатель на следующий и саму строку в виде записи переменной длины.
2. Структурное описание разработки
двоичный файл программа редактор
Для реализации поставленной задачи был разработан новый класс «bin_file».
Он является классом-наследником от fstream. bin_file позволяет осуществлять работу со структурой данных односвязный список строк(переменной длины), используя двоичный файл как основное место хранения информации.
На данном рисунке представлена внутренняя структура двоичного файла.
В начале файла расположен заголовок (по умолчанию bin) занимающий 3 байта. За ним идет файловый указатель Next (4 байта), указывающий на следующий элемент списка, если такого не имеется он равен 0, текущий элемент является последним. За Next так же следует целочисленное значение задающее длину строки содержащейся в элементе. Последней расположена сама строка.
Для временного хранения обрабатываемого элемента списка, в класс были добавлены такие поля как:
private:
int next;
int 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: использовать готовый
int i=0;
if(p==0){
write(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, если собирается воспользоваться готовым файлом, и все что нужно сделать это связать поток ввода-вывода с двоичным файлом.
Конструктор без параметров:
bin_file():basic_fstream(){};
используется только для возможности создания указателя на объект класса, без привязки к двоичному файлу, это может быть полезно, если заведомо не известно имя файла который будет использоваться.
Далее, функция
void bin_file::set_elem(char *_str);
На вход принимает строку(будущий элемент списка). Устанавливает значения полей класса для дальнейшего добавления в список, указателю next присваивает значение 0, так как добавление происходит в конец списка и данный элемент должен оказаться завершающим.
Пожалуй самый важный элемент класса bin_file, который и создает структуру такой какая она есть, метод:
void add_elem();
Первое, что происходит, это установка позиции для чтения в файле
seekp(7,ios::beg); Она устанавливается для чтения длины первого элемента списка(заголовок 3 байта + указатель на следующий 4 байта = 7 байт). Если после прочтения длина первого элемента оказалась равной 0, приходим к выводу, что список пуст, и добавлять нужно первый элемент.
if(first_lng==0){ //список пуст
seekp(3,ios::beg);//первый эл-т
write((char *)&next,4);//файловый указатель на след элем
write((char *)&length,4);//длина строки
write(str,length);//строка
}
В противном случае, в списке уже существуют элементы. Тут добавление происходит сложнее, изначально нужно добраться до последнего элемента списка.
Двигаемся по структуре и считываем каждый элемент, пока не находим с нулевым указателем.
do{
read((char *)&_next,4);//указ на след
read((char *)&_length,4);//указ на след
int _pos=tellp();//тек позиция
if(_next==0){
/********************************************/
break;
}
seekp(_next);
}while(1);
Оказавшись в нужном месте, первое, что происходит -- перемещение позиции чтения файла на Next последнего элемента. Изменяя это значение с 0 на 4+4+Length от текущей позиции, что соответствует концу двоичного файла. Затем переходим в только что установленную позицию, и записываем туда новый элемент списка.
На этом добавление завершается.
Метод:
void show_list();
последовательно перемещается по двоичному файлу, выводя каждый элемент на экран. Для временного хранения считываемой информации используются private поля класса bin_file.
Метод:
void add_txtfile(char * name_file);
На вход принимает строку, имя текстового файла. Последовательно считывая текст, вызывает для каждого полученного слова функцию add_elem. Дойдя до конца текста, получаем его готовую структуру на односвязном списке, записанном в двоичном файле.
Метод:
void create_txtfile(char *name_file);
аналогичен предыдущему. Только считывается теперь структура двоичного файла, и последовательно записывается каждый элемент списка(в данном случае слова) в текстовый файл.
4. Описание интерфейса программы
Для демонстрации работы класса был создан интерфейс-меню, позволяющий показать работу всех методов класса.
Для вызова пункта меню, нужно ввести его номер.
При успешном соединении с двоичным файлом, программа сообщает о этом(пункты 1,2).
Пример добавления нескольких строк и вывод их на экран(п.3,п.3,п.4).
5. Контрольные примеры
Для проверки скорости выполнения операций, добавим к существующему списку из двух элементов текстовый файл.
Добавление текстового файла из 300 слов: 2823 миллисекунд.
Как мы можем увидеть, уже с 300 элементов добавление выполняется очень долго, это связанно с постоянным обращением к жесткому диску для записи элемента, а также нахождению места для записи.
Выводы
В результате проведённой работы был разработан класс bin_file, хранящий свои элементы в двоичном файле. Работа с файлом происходит в бинарном режиме.
Плюсы подхода: память, отводимая под список, ограничивается пространством жёсткого диска, а не оперативной памятью. Со списком легко возобновить работу, так как все данные хранятся в файле.
Минусы: низкая производительность по сравнению с аналогичным списком, работающим с оперативной памятью.
Список использованной литературы
Р. Лафоре «Объектно-ориентированное программирование в C++»
«Питер.»
Приложение А. Файл «MyClass.h»
#include <iostream>
#include <fstream>
using namespace std;
//const int L_NAME=20;
class bin_file : public std::fstream{
private:
int next;
int length;
char *str;
public:
static char *name_list;
void set_elem(char *_str);
void add_elem();
void show_list();
void add_txtfile(char * name_file);
void create_txtfile(char *name_file);
bin_file():basic_fstream(){};
bin_file(const char *name,int p):basic_fstream(name, ios::in | ios::out | ios::binary){//p=0: новый файл p=1: использовать готовый
int i=0;
if(p==0){
write(name_list,strlen(name_list));
write((char *)&i,4); //указатель на след
write((char *)&i,4);//длина 1строки
}
cout<<"Open.\n";
};
};
void bin_file::set_elem(char *_str){
length=strlen(_str);//
next=0;
str=_strdup(_str);
};
void bin_file::add_elem(){
seekp(7,ios::beg);//длина первого эл-та
int first_lng=0;
read((char *)&first_lng,4);
if(first_lng==0){ //список пуст
seekp(3,ios::beg);//первый эл-т
write((char *)&next,4);//файловый указатель на след элем
write((char *)&length,4);//длина строки
write(str,length);//строка
}else{
seekp(3,ios::beg);
int _next;
int _length;
do{
read((char *)&_next,4);//указ на след
read((char *)&_length,4);//указ на след
int _pos=tellp();//тек позиция
if(_next==0){
seekp(_pos-8,ios::beg);//позиция на указатель
int tmp_point=_pos+_length;
write((char *)&tmp_point,4);//пишем адрес позиции следующего
seekp(tmp_point,ios::beg);//указ на записываемый эл-т
write((char *)&next,4);//файловый указатель на след элем
write((char *)&length,4);//длина строки
write(str,length);//строка
break;
}
seekp(_next);
}while(1);
}
};
void bin_file::show_list(){
int _next;
int _length;
char *strout;
seekp(3,ios::beg);//заголовок
do{
read((char *)&_next,4);//next
read((char *)&_length,4);
strout=new char[_length];
read(strout,_length);
cout<<"Elem: ";
for(int _i=0;_i<_length;_i++)
cout<<strout[_i];
cout<<"->"<<endl;
seekp(_next);
} while(_next!=0);
};
void bin_file::add_txtfile(char *name_file){
ifstream mystr(name_file);
if(!out){ //проверка создания файла
cout << "Cannot open file. " << endl;
return ;
}
int _k=0;
char word[64];
while(!mystr.eof()){
mystr>>word;
set_elem(word);
add_elem();
}
};
void bin_file::create_txtfile(char *name_file){
ofstream out(name_file);
if(!out){ //проверка создания файла
cout << "Cannot create file. " << endl;
return ;
}
int _next;
int _length;
char *strout;
seekp(3,ios::beg);//заголовок
do{
read((char *)&_next,4);//next
read((char *)&_length,4);
strout=new char[_length];
read(strout,_length);
strout[_length]='\0';
//for(int _i=0;_i<_length;_i++)
out<<strout<<" ";
seekp(_next);
} while(_next!=0);
};
Приложение Б. Файл «courses.cpp»
#include "stdafx.h"
#include "MyClass.h"
#include <conio.h>
#include <time.h>
char * bin_file::name_list="bin";
int _tmain(int argc, _TCHAR* argv[])
{
bin_file *file;
try{
while(1){
cout<<"Menu: \n";
cout<<"1) Connect new.\n";
cout<<"2) Connect complite.\n";
cout<<"3) Add element.\n";
cout<<"4) Show list. \n";
cout<<"5) Add txt file. \n";
cout<<"6) Create txt file.\n";
cout<<"Esc for exit.\n";
switch(_getch()){
case '1'://connect
file=new bin_file("test.bin",0);
if(!file)
throw 1;
else
cout<<"File connect.\n";
break;
case '2':
file=new bin_file("test.bin",1);
if(!file)
throw 1;
else
cout<<"File connect.\n";
break;
case '3':
char _ch[20];
cout<<"String: ";
cin>>_ch;
file->set_elem(_ch);
file->add_elem();
break;
case '4':
file->show_list();
break;
case '5':
{
long t1=clock();
file->add_txtfile("file.txt");
long t2=clock();
cout<<"Complite. \n"<<t2-t1;}
break;
case '6':
file->create_txtfile("out_file.txt");
cout<<"Complite.\n";
break;
case 27: //exit
return 0;
}
}
}
catch(int)
{cerr<<"File not found.\n";};
_getch();return 0; }
Размещено на www.allbest.
Подобные документы
Разработка шаблона для работы с двоичным файлом, в котором хранится структура данных (двоичное дерево объектов). Представление двоичного дерева в файле. Вставка объекта в дерево, его удаление. Алгоритм сжатия файла. Описание пользовательского интерфейса.
курсовая работа [1,1 M], добавлен 26.01.2013Алгоритм и код программы для создания исходного двоичного файла чисел с произвольным количеством элементов, чтения из файла действительных восьмибайтных элементов и подсчёта общего количества элементов файла. Вывод результата работы программы на экран.
контрольная работа [1,0 M], добавлен 23.11.2014Описание типизированных файлов. Принципы работы с файлами, создание и открытие на запись нового файла. Чтение из файла, открытие существующего файла на чтение. Определение имени файла. Запись в текстовый файл. Описание множества и операции над ними.
реферат [86,4 K], добавлен 07.02.2011Процедура ввода исходных данных в программу, вывод результатов работы программы на экран. Принцип организации хранения логически связанных наборов информации в виде файлов. Параметры характеристики файла, способы обращения к нему, соглашения по типу.
реферат [14,5 K], добавлен 06.12.2011Структура заданного исходного файла и структуры данных, соответствующие данным файла. Подпрограмма проверки принадлежности текста к одной из шести кодовых таблиц. Алгоритмы перекодировки файла в cp1251. Алгоритм сортировки записей исходного файла.
курсовая работа [63,7 K], добавлен 12.12.2010Принципы программирования файловой структуры в операционной системе Windows. Свойства и методы класса Tstream. Пример создания, чтения и записи потока. Чтение, запись и внутренняя структура файла. Пример чтения из файла, начиная с заданной позиции.
курсовая работа [251,6 K], добавлен 18.05.2011Словесное описание алгоритма программы. Открытие файла процедурой Rewrite, его проверка на наличие ошибок при открытии. Особенности построения диаграммы. Листинг программы, ее тестирование и отладка. Выполнение процедуры CloseFile при закрытии файла.
контрольная работа [17,3 K], добавлен 11.06.2010Назначение команды "diskcomp". Текст и запуск командного файла. Сравнение команды в Windows 7 и Windows XP. Разработка файла-сценария в ОС Linux. Создание файла в подкаталоге. Создание файла "oglavlenie.txt" с отсортированным по времени списком файлов.
курсовая работа [1,6 M], добавлен 22.08.2012Структура данных с указанием типов. Общая структурная схема программы. Алгоритмы сортировки вставками. Назначение make-файла. Функции управления программой; перемещения и корректировки введенных данных и их удаления справочника, загрузки данных из файла.
курсовая работа [1,3 M], добавлен 12.01.2016Основы проверки и расчета входных данных и вывода выходных данных программы, их блок-схемы. Реализация функции считывания числовых данных из файла, управление (создание, уничтожение и редактирование) визуальными компонентами во время выполнения программы.
контрольная работа [1,3 M], добавлен 12.06.2009