Показать сообщение отдельно
  #57  
Старый 22.04.2011, 20:10
Аватар для Gligarr
Мастер слова
 
Регистрация: 05.01.2008
Сообщений: 1,435
Репутация: 519 [+/-]
Цитата:
Сообщение от Waterplz Посмотреть сообщение
то есть этот цикл у тебя или выполниться 0 раз (при пустом файле), или будет бесконечным.
Ну в данной функции у меня программа работает без проблем. Выполнение идёт, так как в процедуре fread прописываются и шаг перехода "sizeof(t1)" и число элементов "1" (то есть одна структура). Поэтому, ошибки здесь, думаю, нет.

А вот здесь почему то не получается удалить структуру... Как раз переходит или в бесконечный цикл, или не даёт нужного эффекта.
Баг происходит после нажатия клавиши "Y", если верить отладчику...
Вообще, как можно организовать удаление определенной структуры?

Скрытый текст - Удаление структур с t1.weight<10:
[PHP]void delete10(FILE *tf)
{
char ch;
int i=0,n=0;
tf=fopen("lug.dat","rb+");
while(!feof(tf))
{
fread(&t1,sizeof(t1),1,tf);
if(t1.weight<10)
{
printf("\n Luggage of %s weighs less then 10. Delete data about %s? y/n \n", t1.name, t1.name);
ch=getch();
if(ch=='y')
{
fseek(tf,-sizeof(t1),SEEK_CUR);
fwrite(&n,1,sizeof(t1),tf);
fclose(tf);
}
}
}
}[/PHP]


По выполнении программы обнуляется (а нужно чтоб удалилась) первая строчка удовлетворяющая заданному условию. А остальные, тоже удовлетворяющие, почему-то остаются без изменений (хотя тоже должны удалиться)...

Вот программа целиком:

Скрытый текст - Программа:
[PHP]#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<math.h>
struct luggage {char name[20]; int number; float weight;}t1;
void create(FILE *);
void open(FILE *);
void add(FILE *);
void delete10(FILE *);
main()
{
char c;
FILE *tf;
while(1)
{
puts("1 - New File");
puts("2 - Open File");
puts("3 - Add to File");
puts("4 - Delete info about passengers with weight of luggage less then 10 kilo");
puts("0 - Exit");
c=getch();
switch(c)
{
case'1': create(tf); break;
case'2': open(tf); break;
case'3': add(tf); break;
case'4': delete10(tf); break;
case'0': return 0;
default: puts("Error!");
}
}
}
void create(FILE *tf)
{
char ch;
tf=fopen("lug.dat", "wb");
printf("\n Entering data \n");
do
{
printf("\n Surname: \n");
scanf("%s",t1.name);
printf("\n Number of items: \n");
scanf("%d",&t1.number);
printf("\n The total weight of luggage: \n");
scanf("%f",&t1.weight);
fwrite(&t1,sizeof(t1),1,tf);
printf("\n Finish? y/n \n");
ch=getch();
}
while(ch!='y');
fclose(tf);
}
void open(FILE *tf)
{
int i;
tf=fopen("lug.dat","rb");
i=1;
fread(&t1,sizeof(t1),1,tf);
while(!feof(tf))
{
printf("\n %3d Name %20s with %2d items has %6.2f kilo of luggage \n",i,t1.name,t1.number,t1.weight);
fread(&t1,sizeof(t1),1,tf);
i++;
}
getch();
}
void add(FILE *tf)
{
char ch;
tf=fopen("lug.dat","ab");
printf("\n Entering data \n");
do
{
printf("\n Surname: \n");
scanf("%s",t1.name);
printf("\n Number of items: \n");
scanf("%d",&t1.number);
printf("\n The total weight of luggage: \n");
scanf("%f",&t1.weight);
fwrite(&t1,sizeof(t1),1,tf);
printf("\n Finish? y/n \n");
ch=getch();
}
while(ch!='y');
fclose(tf);
}
void delete10(FILE *tf)
{
char ch;
int i=0,n=0;
tf=fopen("lug.dat","rb+");
while(!feof(tf))
{
fread(&t1,sizeof(t1),1,tf);
if(t1.weight<10)
{
printf("\n Luggage of %s weighs less then 10. Delete data about %s? y/n \n", t1.name, t1.name);
ch=getch();
if(ch=='y')
{
fseek(tf,-sizeof(t1),SEEK_CUR);
fwrite(&n,1,sizeof(t1),tf);
fclose(tf);
}
}
}
}

[/PHP]
__________________
Ты неисчерпаем, и на диво трудолюбив© Franka
Королевский ГИГААА-ДРРРЕЕЕЛЬ-УДАААААР!!!
Блог Харухиста
Ответить с цитированием