Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Курсовая работа4 / Модуль хранения данных

.doc
Скачиваний:
12
Добавлен:
01.05.2014
Размер:
44.03 Кб
Скачать

Модуль хранения данных

  1. Описание модуля

Данный модуль предназначен для организации хранения данных определенного типа.

Определение типа состоит из имени типа данных, размера необходимого для хранения экземпляра и имя файла, где будет храниться данные этого типа.

В модуле реализованы три пользовательские функции:

1. Функция get_st:

int get_st(void* pst,char* st_name,int id)

Записывает в память по адресу pst id-ю запись файла, соответствующего типу st_name.

Возвращает: SUCCESS в случае удачи.

Код ошибки в случае не удачи.

2. Функция put_st:

int put_st(void* pst,char* st_name,int* id)

Записывает в конец файла, соответствующего типу st_name, данные по адресу pst и записывает в id получившийся номер записи.

Возвращает: SUCCESS в случае удачи.

Код ошибки в случае не удачи.

3. Функция edit_st:

int edit_st(void* pst,char* st_name,int id)

Переписывает данные id записи файла, соответствующего типу st_name, данными по адресу pst.

Возвращает: SUCCESS в случае удачи.

Код ошибки в случае не удачи.

Для хранения информации описного типа данных используется структура desck

1. char file[15]; //Имя файла

2. char st_name[10]; //Имя структуры

3. int st_size; //Размер структуры

2. Реализация функций

Функция get_st:

int get_st(void* pst,char* st_name,int id){

int i;

int temp;

char file[MAX_FULL_FILE];

FILE *fp;

//Проверка входящих значений

if(id<0||!st_name||!pst) return ERROR_IN_VAR; //Возвращает ошибку если

//неверно вход. значение

//Определение элемента из массива st_desck с именем структуры st_name

for(i=0;i<KOL_ST;i++){

if(!strcmp(st_desck[i].st_name,st_name)) break;

}

if(i==KOL_ST) return ERROR_NOT_OP; //Возвращает ошибку если не найдена

//необходимая операция

//Открытие файла хранящего необходимую структуру

sprintf(file,"%s%s",data_path,st_desck[i].file);

fp=fopen(file,"rb");

if(!fp) return ERROR_FOPEN; //Возвращает ошибку если не удалось

//открыть

//Устанавливаем указатель на нужную структуру

temp=fseek(fp,(long)(id*st_desck[i].st_size),SEEK_SET);

if(temp==-1) return ERROR_FSEEK; //Возвращает ошибку если произошла

//ошибка при перемещении указателя

//Чтение структуры из файла

temp=fread(pst,(unsigned int)st_desck[i].st_size,1,fp);

if(temp==-1||temp==0) return ERROR_FREAD; //Возвращает ошибку если не удалось //прочитать

//Закрытие файла

fclose(fp);

return SUCCESS;

}

Функция put_st:

int put_st(void* pst,char* st_name,int* id){

int i;

int temp;

char file[MAX_FULL_FILE];

FILE *fp;

//Проверка входящих значений

if(!st_name||!pst||!id) return ERROR_IN_VAR; //Возвращает ошибку если

//неверно вход. значение

//Определение элемента из массива st_desck с именем операции op_name

for(i=0;i<KOL_ST;i++){

if(!strcmp(st_desck[i].st_name,st_name)) break;

}

if(i==KOL_ST) return ERROR_NOT_OP; //Возвращает ошибку если не найдена

//необходимая операция

//Открытие файла хранящего необходимую структуру

sprintf(file,"%s%s",data_path,st_desck[i].file);

fp=fopen(file,"ab");

if(!fp) return ERROR_FOPEN; //Возвращает ошибку если не удалось

// открыть

temp=fseek(fp,0,SEEK_END);

if(temp!=0) return ERROR_FSEEK; //Возвращает ошибку если произошла

//ошибка при перемещении указателя

temp=ftell(fp);

if(temp==-1) return ERROR_FTELL;

*id=temp/st_desck[i].st_size;

*(int*)pst=*id;

//Запись структуры в файл

temp=fwrite(pst,st_desck[i].st_size,1,fp);

if(temp!=1) return ERROR_FWRITE; //Возвращает ошибку если не удалось

//записать

//Закрытие файла

fclose(fp);

return SUCCESS;

}

Функция edit_st:

int edit_st(void* pst,char* st_name,int id){

int i;

int temp;

char file[MAX_FULL_FILE];

FILE *fp;

//Проверка входящих значений

if(!st_name||!pst||!id) return ERROR_IN_VAR; //Возвращает ошибку если

//неверно вход. значение

//Определение элемента из массива st_desck с именем операции op_name

for(i=0;i<KOL_ST;i++){

if(!strcmp(st_desck[i].st_name,st_name)) break;

}

if(i==KOL_ST) return ERROR_NOT_OP; //Возвращает ошибку если не найдена

//необходимая операция

//Открытие файла хранящего необходимую структуру

sprintf(file,"%s%s",data_path,st_desck[i].file);

fp=fopen(file,"r+b");

if(!fp) return ERROR_FOPEN; //Возвращает ошибку если не удалось

//открыть

temp=fseek(fp,(long)(id*st_desck[i].st_size),SEEK_SET);

if(temp!=0) return ERROR_FSEEK; //Возвращает ошибку если произошла

//ошибка при перемещении указателя

//Запись структуры в файл

temp=fwrite(pst,st_desck[i].st_size,1,fp);

if(temp!=1) return ERROR_FWRITE; //Возвращает ошибку если не удалось

//записать

//Закрытие файла

fclose(fp);

return SUCCESS;

}

Функция load_desck_text (загрузка информации об хранимых типов данных):

int load_desck_text(char* loc_file){

int i;

int temp;

char file[MAX_FULL_FILE];

FILE *fp;

//Открытие файла хранимого необходимую структуру

sprintf(file,"%s%s",data_path,loc_file);

fp=fopen(file,"r");

if(!fp) return ERROR_FOPEN; //Возвращает ошибку если не удалось

//открыть

//Чтение открытого файла и запись структур в память

for(i=0;1;i++){

temp=fscanf(fp,"%s %s",

st_desck[i].file,

st_desck[i].st_name);

if(temp!=2) break;

st_desck[i].st_size=getsize(st_desck[i].st_name);

}

fclose(fp);

return SUCCESS;

}

Соседние файлы в папке Курсовая работа4