include stdio include stdlib include conio include windows include io

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#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);
}