#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include <io.h>
#include <locale>
#define STRING_SIZE 40
#define LIBRARY_DB "library.bin"
struct rec
{
char fio[STRING_SIZE]; // название
int year; // год издания
};
//Добавление в файл
void AddToFile(const char* FName)
{
FILE *f;
rec newRec, buffer;
fpos_t begin, length, debug;
int posFounded = 0; // -1 - был достигнут конец файла // 0 - не определено // 1 - нужная позиция найдена
if (!(f = fopen(FName, "r+b")))
{
f = fopen(FName, "wb");
}
fflush(stdin);
printf("Введите фамилию:");
gets(newRec.fio);
printf("Введите год издания: ");
scanf("%d", &newRec.year);
fflush(stdin);
//длина файла
length = filelength(fileno(f));
//поиск автора
while(!feof(f) && posFounded!=1) //
{
if(!(fread(&buffer, sizeof(rec), 1, f)))
{
posFounded=-1;
break;
}
if(newRec.year==buffer.year)
{
fseek(f,-sizeof(rec),SEEK_CUR);
posFounded=1;
}
/* if (strcmp(newRec.author, buffer.author) == 0)
{
// сортировка "внутри автора" по названию книги
while((strcmp(newRec.fio, buffer.fio)>0) && (strcmp(newRec.author, buffer.author) == 0))
{
if(!(fread(&buffer, sizeof(rec), 1, f)))
{
posFounded=-1; // конец файла
break;
}
}
if(!posFounded)
{
fseek(f,-sizeof(rec),SEEK_CUR);
posFounded=1;
}
}*/
if(newRec.year < buffer.year)
{
fseek(f,-sizeof(rec),SEEK_CUR);
posFounded=1; // файл кончился
break;
}
}
//позия указателя в файле
fgetpos(f, &begin);
if(posFounded==1)
{// в найденную позицию
do
{
fread(&buffer, sizeof(rec), 1, f); // считывание текущей записи из файла
if (feof(f) || begin >= length)
break;
fseek(f,-sizeof(rec),SEEK_CUR); // смещение на запись назад
fgetpos(f, &debug);
fwrite(&newRec, sizeof(rec), 1, f); // запись предыдущего элемента
fgetpos(f, &begin);
newRec = buffer;
fflush(f); // очистка потока файла, необходима, чтобы избежать переполнения входного потока
}while (begin < length);
}
fwrite(&newRec, sizeof(rec), 1, f); // запись последних данных из буфера
fclose(f);
}
void showRec(rec *buffer)
{
printf("ФИО: %s\nГод: %d\n\n", buffer->fio,buffer->year);
}
// вывод файла на экран
void showDB(const char *FName)
{
FILE *f;
if(!(f=fopen(FName,"rb")))
{
printf("Невозможно открыть файл \"%s\"", FName);
return;
}
rec buffer;
do
{
if(!(fread(&buffer, sizeof(rec), 1, f))) break;
showRec(&buffer);
} while(1);
fclose(f);
}
int main()
{
setlocale(LC_ALL, "rus");
do
{
system("cls");
puts("1 - Добавить книгу");
puts("2 - Показать всю библиотеку");
puts("Esc - Выход");
switch(getch())
{
case '1':
system("cls");
AddToFile(LIBRARY_DB);
break;
case '2':
system("cls");
showDB(LIBRARY_DB);
getch();
break;
case 27: return 0;
}
}while (1);
}