Запись и удаление файлов с гибкого магнитного диска - C (СИ)
Формулировка задачи:
Здравствуйте. У меня в проге 3 проблеммы.
1)Некорректно работает функция суммирования Sum(иногда при проверке выдает Fatal error!,хотя сумма явно меньше 368640)
2)Неправильно работает функция Triproverki(при добавлении в конец и середину стирает предыдущие файлы)
3)Неработает функция empties, которая должна суммировать освободившиеся соседние участки диска
компилирую на dev-cpp. В этой проге всего лишь модель заполнения/очищения диска.
Заранее спасибо, извините если слишком кривой код.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
typedef struct Knot {
char naz[40];
char priz[10];
int dec;
struct Knot *prev;
struct Knot *next;
} Katalog;
Katalog * dobavposled(Katalog *end); //dobavit strukturu poslednei
void show(Katalog *first); //vyvod na ekran
Katalog * udaliperv(Katalog *first,int *d); //osvobozhdaet pamyat' pervoi struktury
Katalog * udaliposled(Katalog *end,int *d); //osvobozhdaet pamyat' posledney struktury
int udalipkey(Katalog *pkey,int *d);//osvobozhdaet pamyat' po abresu na strukturu
int vernyipkey(Katalog *first,Katalog *pkey);//proveryaet pravilnost' vvoda pkey
Katalog * findpkeydec(Katalog *first,const char dc[40]); //nahodit znachenie v spiske
float Sum(Katalog *first);
void ZANSVOB(Katalog *first);
Katalog *Triproverki(Katalog *first);
Katalog *empties(Katalog *first);
main()
{ printf("razmer faila ot 18 do 32768 bytes\n\n");
Katalog *end, *first, *pkey;
float su,ost;
int k,f,Z=5,r=0,i,a;
char m[40];
srand(time(NULL));
first=(Katalog *)malloc(sizeof(Katalog));
while (r==0)
{printf("Vvedite razmer 1 faila\n");
scanf("%i",&a);
if ((a<18)||(a>32768))
printf("Ne pravilno vveden razmer\n");
else
{printf("Vvedite nazvanie 1 faila\n");
scanf("%s",first->naz);
first->dec=a;
first->prev=NULL;
first->next=NULL;
end=first;
r=1;
for(i=1;i<Z;i++)
{
printf("vvedi nazvanie %i faila\n",i+1);
printf("vvedi razmer %i faila\n",i+1);
end=dobavposled(end);
}
while (k!=5)
{
su=Sum(first);
if (su>368640)
{printf("FATAL ERROR!DISK PEREPOLNEN.");
system("PAUSE");
break;
}
ZANSVOB(first);
show(first);
ost=368640-su;
printf("Ostalos mesta za poslednim failom %f \n\n",ost);
printf("\n1)dobavit fail\n2)udalit pervyi\n3)udalit posledniy\n"
"4)udalit fail\n5)Vyhod\n"
"\nvvedite nomer komandy: ");
scanf("%d",&k);
switch (k)
{
case 1:printf("vvedite razmer faila\n");
printf("vvedite nazvanie faila\n");
first=Triproverki(first);
break;
case 2: first=udaliperv(first,&i);
break;
case 3: end=udaliposled(end,&i);
break;
case 4: printf("\nVvedite nazvanie faila: ");
scanf("%s",&m);
pkey=findpkeydec(first,m);
if (vernyipkey(first,pkey))
{
f=udalipkey(pkey,&i);
if (f == 1)
first=udaliperv(first,&i);
else if (f == 2)
end=udaliposled(end,&i);
}
else
printf("\nTakogo faila v spiske net\n");
break;
case 5:break;
case 6:su=Sum(first);
printf("%f",su);
}
}
}
}
}
Katalog * dobavposled(Katalog *end)
{
Katalog * newend;
newend=(Katalog *)malloc(sizeof(Katalog));
scanf("%s",&newend->naz);
scanf("%i",&newend->dec);
newend->prev=end;
newend->next=NULL;
end->next=newend;
return newend;
}
void show(Katalog *first)
{
Katalog *t;
int i=1;
t=first;
printf("\nNUM\tNAZVANE\t RAZMER\t PRIZNAK \n");
while (t != NULL) {
printf("%d)\t%s\t %i\t %s\t\n",
i,t->naz,t->dec,t->priz);
t=t->next;
i++;
}
return;
}
Katalog * udaliperv(Katalog *first,int *d)
{
Katalog *newfirst;
char *FREE="empty";
strcpy(first->naz,FREE);
return(first);
}
Katalog * udaliposled(Katalog *end,int *d)
{
Katalog * newend;
*d=end->dec;
newend=end->prev;
newend->next=NULL;
free(end);
return newend;
}
int udalipkey(Katalog *pkey,int *d)
{char *FREE="empty";
if ((pkey->prev) == NULL)
return 1;
else if ((pkey->next) == NULL)
return 2;
else
{ strcpy(pkey->naz,FREE);
return 0;
}
}
int vernyipkey(Katalog *first,Katalog *pkey)
{
Katalog *t;
t=first;
while (t != NULL)
{
if (t == pkey)
return 1;
else t=t->next;
}
return 0;
}
Katalog * findpkeydec(Katalog *first,const char dc[40])
{
Katalog * t;
t=first;
while(t !=NULL)
{
if (strcmp(t->naz,dc)==0)
return t;
else
t=t->next;
}
return NULL;
}
float Sum(Katalog *first)
{ Katalog *p;
float s;
p=first;
while (p!=NULL)
{s+=p->dec;
p=p->next;
}
return(s);
s=0;
}
void ZANSVOB(Katalog *first)
{ Katalog *u;
char *FREE="empty",*Sv="SVOBODEN",*Zan="Zanyat";
u=first;
while(u!=NULL)
{if (strcmp(u->naz,FREE)==0)
strcpy(u->priz,Sv);
else
strcpy(u->priz,Zan);
u=u->next;
}
}
Katalog *Triproverki(Katalog *first)
{ Katalog *p,*newfail;
char *FREE="SVOBODEN";
newfail=(Katalog *)malloc(sizeof(Katalog));
scanf("%i",&newfail->dec);
scanf("%s",&newfail->naz);
p=first;
while (p!=NULL)
{if ((strcmp(p->priz,FREE)==0)&&(p->prev==NULL)&&(p->dec>newfail->dec))
{p->dec=p->dec-newfail->dec;
newfail->next=p;
newfail->prev=NULL;
p->prev=newfail;
return newfail;}
else if ((strcmp(p->priz,FREE)==0)&&(p->prev!=NULL)&&(p->dec>newfail->dec))
{p->prev->next=newfail;
newfail->prev=p->prev;
newfail->next=p;
p->prev=newfail;
p->dec=p->dec-newfail->dec;
return newfail;}
else if (p->next==NULL)
{newfail->prev=p;
newfail->next=NULL;
p->next=newfail;
return newfail;}
p=p->next;
}
}
/*Katalog *empties(Katalog *first)
{ Katalog *p;
char *FREE="SVOBODEN";
p=first;
while (p!=NULL)
{if ((strcmp(p->priz,FREE)==0)&&(strcmp(p->next->priz,FREE)==0))
{
p->next=p->next->next;
p->dec=p->dec+p->next->dec;
free(p->next);
}
p=p->next;
}
return(p);
}*/Решение задачи: «Запись и удаление файлов с гибкого магнитного диска»
textual
Листинг программы
scanf("%s",&newfail->naz);
Объяснение кода листинга программы
В данном коде, скорее всего, происходит следующее:
- Вводится строка с названием файла с помощью функции scanf().
- Полученная строка сохраняется в переменной
newfail->naz.newfail- это структура данных, в которой хранится информация о файле.naz- это поле структуры, в которое записывается название файла.