|
|
|
|
ЛАБОРАТОРНАЯ №5 ВАРИАНТ 7
| Задача: Файл записей переменной длины, содержащих информацию о книгах. Написать функции
записи в файл с заданным именем массива таких структур и функцию поиска
в файле и чтения записи с заданным названием книги. Программа должна
работать следующим образом: если в командной строке один аргумент (это
должно быть имя файла), то вызывается функция записи введенного с
клавиатуры массива структур, если аргументов два ( имя файла и строка –
название книги), то вызывается функция поиска и чтения из файла информации
о книге. |
| >>Скачать<< |
| Решение: |
//---------------------------------------------------------------------------
#include < stdio.h >
#include < stdlib.h >
#include < string.h >
#define SIGN "VAR7_LAB5.0"
#define MAX 5 //Количество записей в массиве
struct Book //Описание структуры записи
{
int pages; //кол-во страниц
int length; //длина названия книги
char *title; //название
}DATA[MAX];
//---------------------------------------------------------------------------
FILE *CreateBASE(char *name) //Создание файла с базой книг
{
FILE *output = fopen(name,"w"); //Открытие файла
if(!output) return output;
else
{ //Запись сигнатуры
int slen = strlen(SIGN) + 1;
if(fwrite(SIGN,sizeof(char),slen,output) != slen)
{
fclose(output);
output = NULL;
}
}
//Ввод значений вручную...
int n = 0; char buf[256];
while(1) //Ввод записей
{
puts("Vvedite Nazvanie knigi i kolichestvo stranic:");
gets(buf);
if(strcmp(buf,"") == 0) break;
DATA[n].title = new char[ strlen(buf) + 1 ];
strcpy(DATA[n].title, buf);
DATA[n].length = strlen(DATA[n].title);
fwrite(&DATA[n].length,sizeof(int),1,output); //Запись длинны названия книги
gets(buf); //Чтение количества страниц
DATA[n].pages = atoi(buf);
fwrite(&DATA[n].pages,sizeof(int),1,output); //Запись количества страниц
fwrite(DATA[n].title,sizeof(char),strlen(DATA[n].title)+1,output);
n++;
}
fwrite(&n,sizeof(int),1,output); //Запись количества записей в файл
fclose(output);
return(output);
}
//---------------------------------------------------------------------------
FILE *PrintBASE(char *name,char *book) //Функция вывода информации (и поиска)
{
//Проверка на поиск:
int pr = 0; int rec = 0;
if(strlen(book) > 0) pr = 1;
if(strcmp(book,"PRINT") == 0) pr = 0;
FILE *input = fopen(name,"r"); //Открытие файла
if(input)
{
int slen = strlen(SIGN) + 1;
char buf[32]; //Проверка сигнатуры
if(fread(buf,sizeof(char),slen,input) != slen) //+
{
printf("READING ERROR!!!\n");
fclose(input);
input = NULL;
}
else
if(strcmp(buf,SIGN) != 0)
{
printf("FORMAT ERROR!!!\n");
fclose(input);
input = NULL;
}
else
{
//Вывод файла
int maxn = 0;
fseek(input,-sizeof(int),SEEK_END); //Перемещение в конец файла
fread(&maxn,sizeof(int),1,input);
// printf("%d\n",maxn); //Вывод количества записей в файле
fseek(input,slen,SEEK_SET); //Перемещение в начало (позиция после сигнатуры)
char buffer[256]; int value = 0; int i = 0;
while(i != maxn)
{
value = 0;
fread(&value,sizeof(int),1,input); //Чтение длины названия книги
DATA[i].length = value;
int count = fread(&value, sizeof(int),1,input); //Чтение количества страниц
fread(buffer,sizeof(char),DATA[i].length+1 ,input); //Чтение названия книги
DATA[i].title = new char[ DATA[i].length + 1 ];
strcpy( DATA[i].title, buffer);
DATA[i].pages = value;
//Вывод на экран
if(!pr) printf("%s %d\n",DATA[i].title,DATA[i].pages);
if(pr == 1) //В случае поиска в базе...
if(strcmp(DATA[i].title,book) == 0)
{
rec = i;
break;
}
i++;
}
}
}
fclose(input);
//Вывод результата поиска
if(rec > 0) printf("%s %d NAIDENA!!!\n",DATA[rec].title,DATA[rec].pages);
if(rec == 0 && pr == 1) puts("NE NAIDENO!!!");
return input;
}
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
switch (argc)
{
case 2:
{
if(!CreateBASE(argv[1])) puts("WRITING ERROR: UNABLE TO CREATE FILE!!!");
else puts("WRITING OK!");
} break;
case 3: PrintBASE(argv[1],argv[2]); break;
}
system("PAUSE");
}
//---------------------------------------------------------------------------
|
| |
Используются технологии uCoz
|