Функции и Графики ПРОГРАММИРОВАНИЕ на C++ / Turbo Pascal

ФУНКЦИИ
и ГРАФИКИ

ЭЛЕМЕНТАРНЫЕ ФУНКЦИИ
ГРАФИКИ
ТЕСТЫ
КОНТАКТЫ
КАРТА САЙТА
НА ГЛАВНУЮ

NEW !!!

ПРОГРАММИРОВАНИЕ
TURBO PASCAL
C++
ПРОВЕРЬ СВОИ ЗНАНИЯ!
ЛАБОРАТОРНАЯ №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