Как удалить структуру из файла? - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток! Заранее скажу что

поиск юзал

=)

Если в кратце:

как удалить структуру из файла? записываем с помощью fwrite(&struct1,sizeof(struct1),1,fp) а как её удалить? синтаксис команды fwrite?

Если развернуто:

Вводные данные:

Используя функции и режим меню, создать файл из 10 структур, просмотреть файл, добавить в файл новую информацию и, применяя режим прямого доступа, выполнить задание по своему варианту. Структура имеет вид: фамилия спортсмена, его номер, количество набранных очков. Удалить из списка информацию о спортсмене с наименьшим количеством очков.

Создаю структуру:
struct sportsman{
  char surname[255];
  int number;
  int points;
} data
С помощью ф-ии NewFile(FILE *) создаю новый файл и вношу в него необходимые записи:
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);
}
Интересует вопрос: как удалить какую - либо запись из файла? Для начала без сортировки(не по заданию), а допустим по фильтру вводимому с клавиатуры, по полю number структуры sportsman. Написал такую функцию:
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);
}
Т.е. вводим с клавиатуры num,далее последовательно считываем все структуры из файла,в случае если введенный num совпадает с sportsman.number - перемещаем указатель на начало найденной структуры, и прописываем в это место NULL:
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++;
  }

Объяснение кода листинга программы

  1. Объявлена переменная data типа struct.
  2. Объявлена переменная n типа int.
  3. Открыт файл fp для чтения с помощью функции fopen.
  4. В цикле while с условием !feof(fp) происходит чтение данных из файла в переменную data с помощью функции fread.
  5. После каждого успешного чтения увеличивается счетчик n.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.5 из 5
Похожие ответы