Новичок
Джуниор
Регистрация: 08.03.2012
Сообщений: 2
|
Проблема с динамической памятью в си
Проблема доступа к елементам динамического массива. Есть файл структур. Его можно редактировать, дописывать и удалять структуры.Нужно вывести стрктуры в порядке возростания или убывание стоимости. Для сортировки выделяю с динамической памяти массив размером в файл. Сортировка работает нормально и выводятся отсортированые данные, но если запустить процедуру сортировки после дописывания записей в конец файла то выводятся такие данные как на скришоте. Подскажите в чём проблема.
процедура сортировки:
Код:
int sort()
{
f=fopen("rezult.dat","rb");
if(f==NULL) puts("fail zapisey ne nayden");else
if(filelength(fileno(f))==0) printf("baza dannuh pusta");
else
{
printf("%i",filelength(fileno(f)));
getch();
fclose(f);
f=fopen("rezult.dat","rb");
tov *mas;
for (i=9;i<=17;i++)
{
gotoxy(21,i);
printf("--------------------------------------------");
i++;
}
for (i=10;i<17;i++)
{
gotoxy(64,i);
printf("|");
gotoxy(21,i);
printf("|");
}
gotoxy(24,10);
printf("Zdelayte vubor");
gotoxy(22,12);
printf("1 - vuvesti u poryadke vozrostaniya chenu");
gotoxy(22,14);
printf("2 - vuvesti u poradke ubuvaniya chenu");
gotoxy(22,16);
printf("Esc - vuyti v glavnoe menu");
do
{
us=getch();
if(us==27){fclose(f); return 0;}
}
while((us!='1')&&(us!='2'));
clrscr();
j=filelength(fileno(f))/sizeof(z);
mas=(tov*)calloc(j,sizeof(tov));
for(i=0;i<j;i++)
{
fread(&z,sizeof(z),1,f);
mas[i]=z;
if((mas[i].date.day>=10)&&(mas[i].date.mon>=10))
printf("%-5i%-18s%-18s%-10.2f%-7i%i.%i.%i\n", i+1,mas[i].nazva,mas[i].firma,mas[i].price,mas[i].kilk,mas[i].date.day,mas[i].date.mon,mas[i].date.year) ;
else if ((mas[i].date.day<10)&&(z.date.mon<10))
printf("%-5i%-18s%-18s%-10.2f%-7i0%i.0%i.%i\n", i+1,mas[i].nazva,mas[i].firma,mas[i].price,mas[i].kilk,mas[i].date.day,mas[i].date.mon,mas[i].date.year) ;
else if(mas[i].date.day<10) printf("%-5i%-18s%-18s%-10.2f%-7i0%i.%i.%i\n", i+1,mas[i].nazva,mas[i].firma,mas[i].price,mas[i].kilk,mas[i].date.day,mas[i].date.mon,mas[i].date.year) ;
else printf("%-5i%-18s%-18s%-10.2f%-7i%i.0%i.%i\n", i+1,mas[i].nazva,mas[i].firma,mas[i].price,mas[i].kilk,mas[i].date.day,mas[i].date.mon,mas[i].date.year) ;
}
getch();
fclose(f);
int left=0,right=j-1;
printf("\n");
while(left<right)
{
for(i=left;i<=right;i++)
{
if (mas[i].price>mas[i+1].price)
{
z=mas[i];
mas[i]=mas[i+1];
mas[i+1]=z;
}
}
for(i=right;i>left;i--)
{
if (mas[i].price<mas[i-1].price)
{
z=mas[i];
mas[i]=mas[i-1];
mas[i-1]=z;
}
}
left++;
}
if(us=='1')
for(i=0;i<j;i++)
{
if((mas[i].date.day>=10)&&(mas[i].date.mon>=10))
printf("%-5i%-18s%-18s%-10.2f%-7i%i.%i.%i\n", i+1,mas[i].nazva,mas[i].firma,mas[i].price,mas[i].kilk,mas[i].date.day,mas[i].date.mon,mas[i].date.year) ;
else if ((mas[i].date.day<10)&&(z.date.mon<10))
printf("%-5i%-18s%-18s%-10.2f%-7i0%i.0%i.%i\n", i+1,mas[i].nazva,mas[i].firma,mas[i].price,mas[i].kilk,mas[i].date.day,mas[i].date.mon,mas[i].date.year) ;
else if(mas[i].date.day<10) printf("%-5i%-18s%-18s%-10.2f%-7i0%i.%i.%i\n", i+1,mas[i].nazva,mas[i].firma,mas[i].price,mas[i].kilk,mas[i].date.day,mas[i].date.mon,mas[i].date.year) ;
else printf("%-5i%-18s%-18s%-10.2f%-7i%i.0%i.%i\n", i+1,mas[i].nazva,mas[i].firma,mas[i].price,mas[i].kilk,mas[i].date.day,mas[i].date.mon,mas[i].date.year) ;
}
else
for(i=j-1;i>=0;i--)
{
if((mas[i].date.day>=10)&&(mas[i].date.mon>=10))
printf("%-5i%-18s%-18s%-10.2f%-7i%i.%i.%i\n", j-i,mas[i].nazva,mas[i].firma,mas[i].price,mas[i].kilk,mas[i].date.day,mas[i].date.mon,mas[i].date.year) ;
else if ((mas[i].date.day<10)&&(z.date.mon<10))
printf("%-5i%-18s%-18s%-10.2f%-7i0%i.0%i.%i\n", j-i,mas[i].nazva,mas[i].firma,mas[i].price,mas[i].kilk,mas[i].date.day,mas[i].date.mon,mas[i].date.year) ;
else if(mas[i].date.day<10) printf("%-5i%-18s%-18s%-10.2f%-7i0%i.%i.%i\n", j-i,mas[i].nazva,mas[i].firma,mas[i].price,mas[i].kilk,mas[i].date.day,mas[i].date.mon,mas[i].date.year) ;
else printf("%-5i%-18s%-18s%-10.2f%-7i%i.0%i.%i\n", j-i,mas[i].nazva,mas[i].firma,mas[i].price,mas[i].kilk,mas[i].date.day,mas[i].date.mon,mas[i].date.year) ;
}
free(mas);
}
getch();
return 0;
}
(mas[i].date.mon
|