
Курсовая работа4 / Модуль хранения данных
.docМодуль хранения данных
-
Описание модуля
Данный модуль предназначен для организации хранения данных определенного типа.
Определение типа состоит из имени типа данных, размера необходимого для хранения экземпляра и имя файла, где будет храниться данные этого типа.
В модуле реализованы три пользовательские функции:
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;
}