Как удалить структуру из файла? - C (СИ)
Формулировка задачи:
Доброго времени суток! Заранее скажу что С помощью ф-ии NewFile(FILE *) создаю новый файл и вношу в него необходимые записи:
Интересует вопрос: как удалить какую - либо запись из файла? Для начала без сортировки(не по заданию), а допустим по фильтру вводимому с клавиатуры, по полю number структуры sportsman.
Написал такую функцию:
Т.е. вводим с клавиатуры num,далее последовательно считываем все структуры из файла,в случае если введенный num совпадает с sportsman.number - перемещаем указатель на начало найденной структуры, и прописываем в это место NULL:
Не работает..зараза....подскажите что не так делаю?
Вот полный текст программы с комментариями:
поиск юзал
=)Если в кратце:
как удалить структуру из файла? записываем с помощью fwrite(&struct1,sizeof(struct1),1,fp) а как её удалить? синтаксис команды fwrite?Если развернуто:
Вводные данные:
Используя функции и режим меню, создать файл из 10 структур, просмотреть файл, добавить в файл новую информацию и, применяя режим прямого доступа, выполнить задание по своему варианту. Структура имеет вид: фамилия спортсмена, его номер, количество набранных очков. Удалить из списка информацию о спортсмене с наименьшим количеством очков.
Создаю структуру:struct sportsman{
char surname[255];
int number;
int points;
} datavoid NewFile(FILE *fp)
{
char ch;
clrscr();
fp=fopen("database.dat","wb");
printf("\nWARNING! THE OLD DATA WILL BE LOST! CONTINUE? Y/N");
ch=getch();
if (ch=='n')
return;
else
do
{
printf("\nEnter sportsmans surname: ");
scanf("%s",data.surname);
printf("\nEnter sportsmans number: ");
scanf("%d",&data.number);
printf("\nEnter sportsmans points: ");
scanf("%d",&data.points);
fwrite(&data,sizeof(data),1,fp);
printf("\n End entering? y/n ");
ch=getch();
}
while (ch!='y');
fclose(fp);
}void SearchFile(FILE *fp)
{
char ch;
int num;
clrscr();
fp=fopen("database.dat","rb+");
printf("Enter sportsmans number:");
scanf("%d",&num);
while(!feof(fp))
{
fread(&data,sizeof(data),1,fp);
printf("\n%4s %3d %3d",data.surname,data.number,data.points);
if (data.number==num)
{
printf(":%s ---- SPOTSMAN = SEARCHED",data.surname);
fseek(fp,-sizeof(data),2);
fwrite(NULL,sizeof(data),1,fp);
break;
}
}
getch();
fclose(fp);
}fseek(fp,-sizeof(data),2);
fwrite(NULL,sizeof(data),1,fp);#include <stdio.h>
#include <conio.h>
//-------------PROTOTYPES SECTION-----------------;
void NewFile(FILE *);
void ViewFile(FILE *);
void AppendFile(FILE *);
void SearchFile(FILE *);
//--------------STRUCTURE DECLARE-----------------;
struct sportsman{
char surname[255];
int number;
int points;
} data;
//-------------GLOBAL DATA DECLARE----------------;
FILE *fp;
//-------------ENTRY POINT------------------------;
main()
{
char choise;
do
{
clrscr();
printf("\n1 - New file");
printf("\n2 - View file");
printf("\n3 - Append file");
printf("\n4 - Search");
printf("\n0 - Exit");
printf("\n\nSelect option: ");
choise=getch();
switch(choise)
{
case '1': NewFile(fp); break;
case '2': ViewFile(fp); break;
case '3': AppendFile(fp); break;
case '4': SearchFile(fp); break;
default: printf("Incorrect enter");
}
}
while (choise!='0');
}
//-------------FUNCTIONS SECTION-----------------;
void NewFile(FILE *fp)
{
char ch;
clrscr();
fp=fopen("database.dat","wb");
printf("\nWARNING! THE OLD DATA WILL BE LOST! CONTINUE? Y/N");
ch=getch();
if (ch=='n')
return;
else
do
{
printf("\nEnter sportsmans surname: ");
scanf("%s",data.surname);
printf("\nEnter sportsmans number: ");
scanf("%d",&data.number);
printf("\nEnter sportsmans points: ");
scanf("%d",&data.points);
fwrite(&data,sizeof(data),1,fp);
printf("\n End entering? y/n ");
ch=getch();
}
while (ch!='y');
fclose(fp);
}
void ViewFile(FILE *fp)
{
char ch;
int i=1;
clrscr();
fp=fopen("database.dat","rb");
fread(&data,sizeof(data),1,fp);
while(!feof(fp))
{
printf("\n#%d Surname:%15s Number:%3d Points:%3d",i,data.surname,data.number,data.points);
fread(&data,sizeof(data),1,fp);
i++;
}
fclose(fp);
getch();
}
void AppendFile(FILE *fp)
{
char ch;
clrscr();
fp=fopen("database.dat","ab");
do
{
printf("\nEnter sportsmans surname: ");scanf("%s",data.surname);
printf("\nEnter sportsmans number: ");scanf("%d",&data.number);
printf("\nEnter sportsmans points: ");scanf("%d",&data.points);
fwrite(&data,sizeof(data),1,fp);
printf("\nEnd entering? y/n");
ch=getch();
}while (ch!='y');
fclose(fp);
}
void SearchFile(FILE *fp)
{
char ch;
int num;
clrscr();
fp=fopen("database.dat","rb+");
printf("Enter sportsmans number:");
scanf("%d",&num);
while(!feof(fp))
{
fread(&data,sizeof(data),1,fp);
printf("\n%4s %3d %3d",data.surname,data.number,data.points);
if (data.number==num)
{
printf("%s SPOTSMAN = SEARCHED",data.surname);
fseek(fp,-sizeof(data),2);
fwrite(NULL,sizeof(data),1,fp);
break;
}
}
getch();
fclose(fp);
}Решение задачи: «Как удалить структуру из файла?»
textual
Листинг программы
while(!feof(fp))
{
if (fread(&data,sizeof(data),1,fp))
n++;
}
Объяснение кода листинга программы
- Объявлена переменная
dataтипа struct. - Объявлена переменная
nтипа int. - Открыт файл
fpдля чтения с помощью функции fopen. - В цикле while с условием !feof(fp) происходит чтение данных из файла в переменную data с помощью функции fread.
- После каждого успешного чтения увеличивается счетчик n.