Код:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
struct sport { char name[10]; int number; int kol; } sp;
void input(FILE *); // создание нового файла
void print(FILE *); // просмотр файла
void app(FILE *); // добавление в файл
void del(FILE *); // удаление игрока с наименьшим количеством очков
int main(void)
{
char c;
FILE *fp;
while (1)
{
puts(" 1 – новый файл");
puts(" 2 – просмотр файла");
puts(" 3 – добавление в файл");
puts(" 4 – удаление игрока с наименьшим количеством очков");
puts(" 0 - выход");
c = getchar();
switch (c)
{
case '1':input(fp); break;// вот тут ошибка
case '2':print(fp); break;
case '3':app(fp); break;
case '4':del(fp); break;
case '0':return 0;
default: puts("неверный режим");
}
}
}
void input(FILE *fp)
{
char ch;
fp = fopen("file1.dat", "wb"); // открытие бинарного файла для записи
printf("\n Введите информацию о спортсменах \n");
do
{
printf("\n Фамилия: "); scanf("%s", sp.name);
printf(" Номер: "); scanf("%d", &sp.number);
printf(" Количество очков: "); scanf("%d", &sp.kol);
fwrite(&sp, sizeof(sp), 1, fp); // запись в файл одной структуры sp
printf("\n Закончить? y/n ");
ch = getchar();
} while (ch != 'y');
fclose(fp);
}
void print(FILE *fp)
{
int i;
fp = fopen("file1.dat", "rb"); // открытие бинарного файла для чтения
i = 1;
fread(&sp, sizeof(sp), 1, fp); // чтение из файла одной структуры sp
while (!feof(fp))
{
printf("\n %3d спортсмен %-10s номер %d очков %d", i, sp.name, sp.number, sp.kol);
fread(&sp, sizeof(sp), 1, fp);
i++;
}
getchar();
}
void app(FILE *fp)
{
char ch;
fp = fopen("file1.dat", "ab"); // открытие бинарного файла для добавления
printf("\n Введите информацию о спортсменах \n");
do
{
printf("\n Фамилия: "); scanf("%s", sp.name);
printf(" Номер: "); scanf("%d", &sp.number);
printf(" Количество очков: "); scanf("%d", &sp.kol);
fwrite(&sp, sizeof(sp), 1, fp);
printf("Закончить? y/n ");
ch = getchar();
} while (ch != 'y');
fclose(fp);
}
void del(FILE *fp)
{
char ch; // ВОТ ТУТ ОШИБКА
int i, j, n, h;
sport *s, p;
fp = fopen("file1.dat", "rb"); // открытие бинарного файла для чтения
// подсчет числа записей в файле
n = 0;
fseek(fp, 0, 2);
n = ftell(fp) / sizeof(sport);
rewind(fp);
s = (sport *)malloc(n*sizeof(sp));
// заполнение массива
for (i = 0, h = 1; i<n; ++i)
{
fread(&sp, sizeof(sp), 1, fp);
s[i] = sp;
printf("\n %3d спортсмен %-10s номер %d очков %d", h, sp.name, sp.number, sp.kol);
h++;
}
fclose(fp);
fp = fopen("file1.dat", "wb"); // открытие бинарного файла для записи
j = 1;
while (j)
{
j = 0;
for (i = 0; i<n - 1; i++)
{
if (s[i].kol<s[i + 1].kol)
{
p = s[i];
s[i] = s[i + 1];
s[i + 1] = p;
j = 1;
}
}
}
for (i = 0; i<n - 1; ++i)
fwrite(&s[i], sizeof(sp), 1, fp);
printf("\n\n Спортсмен с наименьшим количеством очков: %5s (%d) удален. ", s[n - 1].name, s[n - 1].kol);
getchar();
free(s); // Освобождение выделенной по адресу s памяти
fclose(fp);
}