Давайте для початку просто "пригладимо" ваш код:
void per()
{
FILE *f = fopen( "tov.dat", "r+b" ),
*fs = fopen( "t.dat", "a+b" );
int kol=1, i=0;//краще все ж писати sizeof(struct tovari) всюди, бо потім ще шукати, чим то k є...
struct tovari s;
while(!feof(f))
{
fwrite(&tov, sizeof(struct tovari), 1, fs);
fread (&tov, sizeof(struct tovari), 1, f);
}
rewind(f);
rewind(fs);
while(!feof(f))
{
//переходимо на 1-й елемент fs, не 0-й, а 1-й - так і треба?
fseek(fs, kol++*sizeof(struct tovari), SEEK_SET);
fread(&s, sizeof(struct tovari), 1, fs);
if(strcmp(tov.nazv,s.nazv)>0)
tov=s;//значення s нам більше не знадобиться, нащо ми його зберігаємо?
fseek(f, i++*sizeof(struct tovari), SEEK_SET);
fwrite(&tov, sizeof(struct tovari), 1, f);
fread( &tov, sizeof(struct tovari), 1, f);
}
fclose(fs);
remove("t.dat");
fclose(f);
pr_t();
}
Ніби все почистив.
Тепер по алгоритму. Що ви робите, взагалі? Спочатку повністю копіюєте один файл в інший, потім робите один прохід по новому файлу і розставляєте його елементи по старому, якщо я правильно зрозумів, в трохи впорядкованішому порядку... якщо нічого не наплутали. Я телепатор все ще не полагодив, тому виконати цей код не можу. Але сортування немає. Ви взагалі хоч один алгоритм сортування знаєте?