Как удалить структуру из файла? - 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; } data
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 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д