close

Вход

Забыли?

вход по аккаунту

?

Lab3 (2)

код для вставкиСкачать
Міністерство науки и освіти України
Національний технічний університет України "Київський політехнічний інститут"
Лабораторна робота №3
Виконав:
Студент групи: КВ-12
Перевірив:
Зорін Юрій Михайлович
____________________
Київ 2012
Завдання:
1. Написать функцию, которая записывает в бинарный файл Scaners.dat данные о сканере из приведенной структуры. Структура файла: в первых sizeof( int ) байтах размещается значение типа int, определяющее количество записей в файле, далее без пропусков размещаются записи о сканерах. Функция должна следить, чтобы в файле не было повторяющихся записей.
2. Написать функцию, которая осуществляет первоначальное заполнение бинарного файла Scaners.dat из текстового файла Scaners.csv. Формат .csv(CommaSeparatedValues) предполагает, что каждой строке файла хранится одна запись, а ее поля отделяются друг от друга символом ";".
3. Написать функцию intmake_index(char *dba, char *field_name), которая создает индексный файл для заданного dba-файла. Индексный файл содержит номера записей dba-файла, отсортированные в порядке неубывания по field_name. Имя индексного файла состоит изfield_name и расширения idx.
4. Написать функцию RECORD_SET * get_recs_by_index(char *dba , char *indx_field ), которая возвращает указатель RECORD_SET * на набор записей, полученный с помощью инексного файла indx_field.idx. 5. Написать функциюvoidreindex(char *dba), которая создает индексные файлы по ВСЕМ полям структуры SCAN_INFO.
6. Написать функцию int del_scan(char *dba, int n) , которая удаляет из dba-файла записьс номером n. После удаления записи необходимо вызвать функцию reindex().
7. Написать функцию, которая читает из файла данные о сканерах из dba-файла и выводит в файл *.txt список сканеров, цена которых не превышает заданную.
Файл3 fileoi.h
/************************************************************************
*file: 3Header.h
*purpose: declarations for functions, definition of types
*written: 18/12/2012
*last modified: 23/12/2012
**************************************************************************/
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char manufacturer[127];
char model[128];
int year;
float price;
int x_size;
int y_size;
int optr;
} SCAN_INFO;
typedef struct
{
int rec_nmb;
SCAN_INFO* *recs;
} RECORD_SET;
void write_DAT(FILE* dat, SCAN_INFO* item);
void CSV_to_DAT (char* path_dat, char* path_csv);
void make_index(char *path_dat, char *field_name);
void reindex(char* path_dat);
RECORD_SET* get_recs_by_index(char* path_dat, char *index_field);
int del_scan(char* path_dat, int n);
void price_le(char* path_dat, float lim);
Файл fileoi.c
/************************************************************************
*file: 3Functions.c
*synopsis: The functions use malloc/free to allocate/delatestructures
*These functions are declared in the include file "3Header.h".
*These functions are written for easy work with doubly circular linked lists
*written: 18/12/2012
*last modified: 23/12/2012
************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char manufacturer[127];// изготовитель
char model[128];// наименование модели
int year; // год изготовления
float price;// цена
int x_size;// горизонтальный размер области сканирования
int y_size;// вертикальный размер области сканирования
int optr; // оптическое разрешение
} SCAN_INFO;
typedef struct
{
int rec_nmb;//number of records
SCAN_INFO* *recs;//records } RECORD_SET;
//Считывание строки из CSV файла
SCAN_INFO* read_CSV(FILE* csv)
{
SCAN_INFO* item = (SCAN_INFO*)malloc(sizeof(SCAN_INFO));
fscanf(csv,"%[0-9A-Za-z];%[0-9A-Za-z];%d;%f;%d;%d;%d\n",&(item->manufacturer),&(item->model),&(item->year),&(item->price),&(item->x_size),&(item->y_size),&(item->optr));
return item;
}
//Запись DAT файл
void write_DAT(FILE* dat, SCAN_INFO* item)
{
fseek(dat,0, SEEK_END);
fwrite(item, /*(127+128)*sizeof(char)+4*sizeof(int)+sizeof(float)*/sizeof(SCAN_INFO),1,dat);
}
//Чтение из DAT файла
SCAN_INFO* read_DAT(FILE* dat)
{
SCAN_INFO* item = (SCAN_INFO*)malloc(sizeof(SCAN_INFO));
fread(item,sizeof(SCAN_INFO),1,dat);
return item;
}
//Запись из CSV в DAT
void CSV_to_DAT (char* path_dat, char* path_csv)
{
FILE *csv, *dat; char **log;
SCAN_INFO* item;
int cnt=0,i,eq=0;
unsigned int logsize = 0, logborder=8;
csv=fopen(path_csv,"r"); dat=fopen(path_dat,"w+b");
log = (char**)malloc(logborder*sizeof(char*));
if (!csv || !dat)
{
printf("Unable to open csv or dat file!");
return;
}
fwrite(&cnt, sizeof(int),1,dat);
while (!feof(csv))
{
item=read_CSV(csv);
for(i=0;i<logsize;i++)
{
if(!strcmp(log[i],item->manufacturer) && !strcmp(log[i]+128,item->model))
{
eq=1;
break;
}
}
if (!eq)
{
if (logsize==logborder)
{
logborder+=8;
log=(char**)realloc(log,logborder*sizeof(char*));
}
log[logsize]=(char*)malloc(255*sizeof(char));
strcpy(log[logsize],item->manufacturer);
strcpy(log[logsize]+128,item->model);
logsize++;
cnt++;
write_DAT(dat,item);
free(item);
}
}
for(i=0;i<logsize;i++)
free(log[i]);
rewind(dat);
fwrite(&cnt, sizeof(int),1,dat);
free(log);
fcloseall();
}
//Comparators - "сравниватели" для qsort
int manufacturer_comparator(const void * a, const void * b)
{
return (strcmp((*(SCAN_INFO**)a)->manufacturer,(*(SCAN_INFO**)b)->manufacturer));
}
int year_comparator(const void * a, const void * b)
{
return ((*(SCAN_INFO**)a)->year-(*(SCAN_INFO**)b)->year);
}
int model_comparator(const void * a, const void * b)
{
return (strcmp((*(SCAN_INFO**)a)->model,(*(SCAN_INFO**)b)->model));
}
int price_comparator(const void * a, const void * b)
{
return (int)((*(SCAN_INFO**)a)->price-(*(SCAN_INFO**)b)->price);
}
int x_size_comparator(const void * a, const void * b)
{
return ((*(SCAN_INFO**)a)->x_size-(*(SCAN_INFO**)b)->x_size);
}
int y_size_comparator(const void * a, const void * b)
{
return ((*(SCAN_INFO**)a)->y_size-(*(SCAN_INFO**)b)->y_size);
}
int optr_comparator(const void * a, const void * b)
{
return ((*(SCAN_INFO**)a)->optr-(*(SCAN_INFO**)b)->optr);
}
//end Comparators
//Сотворение индексного файла
void make_index(char *path_dat, char *field_name)
{
int cnt,i,j;
SCAN_INFO** items;
SCAN_INFO* item;
FILE* idx;
FILE* dat;
char* filename = (char*)malloc(strlen(field_name)+5); //5 for filename extension and \0
dat=fopen(path_dat,"a+b");
filename=strcpy(filename, field_name);
filename=strcat(filename, ".idx");
idx=fopen(filename,"w+t");
fread(&cnt,sizeof(int),1,dat);
items=(SCAN_INFO**)malloc(cnt*sizeof(SCAN_INFO));
for(i=0;i<cnt;i++)
{
//items[i]=(SCAN_INFO*)malloc(sizeof(SCAN_INFO));
items[i]=read_DAT(dat);
}
if (field_name=="manufacturer")
qsort(items,cnt,sizeof(SCAN_INFO*),manufacturer_comparator);
if (field_name=="year")
qsort(items,cnt,sizeof(SCAN_INFO*),year_comparator);
if (field_name=="model")
qsort(items,cnt,sizeof(SCAN_INFO*),model_comparator);
if (field_name=="price")
qsort(items,cnt,sizeof(SCAN_INFO*),price_comparator);
if (field_name=="x_size")
qsort(items,cnt,sizeof(SCAN_INFO*),x_size_comparator);
if (field_name=="y_size")
qsort(items,cnt,sizeof(SCAN_INFO*),y_size_comparator);
if (field_name=="optr")
qsort(items,cnt,sizeof(SCAN_INFO*),optr_comparator);
fseek(dat,sizeof(int),0);
for(i=0;i<cnt;i++)
{
item=read_DAT(dat);
for(j=0;j<cnt;j++)
{
if (!items[j]) continue;
if ((!strcmp(item->manufacturer,items[j]->manufacturer))
&& (!strcmp(item->model,items[j]->model)))
{
fprintf(idx,"%d ",j);
free(items[j]);
items[j]=NULL;
}
}
}
free(items);
free(item);
fcloseall();
}
//Сотворение всех индексных файлов
void reindex(char* path_dat)
{
make_index(path_dat,"manufacturer");
make_index(path_dat,"year");
make_index(path_dat,"model");
make_index(path_dat,"price");
make_index(path_dat,"x_size");
make_index(path_dat,"y_size");
make_index(path_dat,"optr");
}
//Массив сортированых по критерию структур
RECORD_SET* get_recs_by_index(char* path_dat, char *index_field)
{
int cnt,i;
SCAN_INFO** items;
FILE* dat=fopen(path_dat,"a+b");
RECORD_SET* set = (RECORD_SET*)malloc(sizeof(RECORD_SET));
fread(&cnt,sizeof(int),1,dat);
items=(SCAN_INFO**)malloc(cnt*sizeof(SCAN_INFO));
for(i=0;i<cnt;i++)
items[i]=read_DAT(dat);
//
//if (index_field=="manufacturer")
//qsort(items,cnt,sizeof(SCAN_INFO*),manufacturer_comparator);
//if (index_field=="year")
//qsort(items,cnt,sizeof(SCAN_INFO*),year_comparator);
//if (index_field=="model")
//qsort(items,cnt,sizeof(SCAN_INFO*),model_comparator);
//if (index_field=="price")
//qsort(items,cnt,sizeof(SCAN_INFO*),price_comparator);
//if (index_field=="x_size")
//qsort(items,cnt,sizeof(SCAN_INFO*),x_size_comparator);
//if (index_field=="y_size")
//qsort(items,cnt,sizeof(SCAN_INFO*),y_size_comparator);
//if (index_field=="optr")
//qsort(items,cnt,sizeof(SCAN_INFO*),optr_comparator);
//
set->rec_nmb=cnt;
set->recs=items;
fcloseall();
return set;
}
//Удаление из файла структуры
int del_scan(char* path_dat, int n)
{
int cnt,i;
SCAN_INFO* item = (SCAN_INFO*)malloc(sizeof(SCAN_INFO));
FILE* dat=fopen(path_dat,"a+b");
FILE* temp=fopen("temp.tmp","w+b");
if (!dat)
{
printf("Unable to open dat file!");
return 1;
}
fread(&cnt,sizeof(int),1,dat);
fseek(temp,sizeof(int),0);
if (n>cnt) return 0;
for(i=0;i<cnt;i++)
{
fread(item,sizeof(SCAN_INFO),1,dat);
if (i==n) continue;
fwrite(item,sizeof(SCAN_INFO),1,temp);
}
cnt--;
fseek(temp,0,0);
fwrite(&cnt,sizeof(int),1,temp);
free(item);
fcloseall();
remove(path_dat);
rename("temp.tmp",path_dat);
reindex(path_dat);
return 0;
}
//Вывод в текстовый файл, если цена меньше или равна
void price_le(char* path_dat, float lim)
{
int cnt,i;
SCAN_INFO* item = (SCAN_INFO*)malloc(sizeof(SCAN_INFO));
FILE* dat=fopen(path_dat,"a+b");
FILE* txt=fopen("price_le.txt","w+t");
if (!dat || !txt)
{
printf("Unable to open dat ot text file!");
return;
}
fread(&cnt,sizeof(int),1,dat);
for(i=0;i<cnt;i++)
{
fread(item,sizeof(SCAN_INFO),1,dat);
if (item->price > lim) continue;
fprintf(txt,"%s %s\n", item->manufacturer, item->model);
}
free(item);
fcloseall();
}
Файл main.c
/*********************************************************************
*file: T.c
*synopsis: Test function by inputting the data
*These functions are declared in the include file "3Header.h".
*written: 18/12/2012
*last modified: 23/12/2012
*********************************************************************/
#include "fileio.h"
#define CSV_PATH "scanners.csv"
#define DAT_PATH "scanners.dat"
int main()
{
int i;
RECORD_SET* a;
CSV_to_DAT(DAT_PATH,CSV_PATH);
make_index(DAT_PATH,"manufacturer");
price_le(DAT_PATH,500);
del_scan(DAT_PATH,3);
price_le(DAT_PATH,500);
a = get_recs_by_index(DAT_PATH,"model");
for(i = 0; i < a->rec_nmb; i++)
{
printf("%d\n",a->recs[i]->year);
printf("%d\n",a->recs[i]->optr);
printf("%d\n",a->recs[i]->x_size);
printf("%d\n",a->recs[i]->y_size);
printf("%f\n",a->recs[i]->price);
printf("%s\n",a->recs[i]->model );
printf("%s\n",a->recs[i]->manufacturer );
}
return 0;
}
Документ
Категория
Рефераты
Просмотров
67
Размер файла
29 Кб
Теги
lab3
1/--страниц
Пожаловаться на содержимое документа