_DeC0der_
Сообщений: 9
Оценки: 0
Присоединился: 2006-09-25 22:40:39.086666
|
Мне нужно переписять архиватор arj так, чтобы он выдавал кое-какую дополнительную информацию. Все вроде работает правильно, но файл сохраняется не до конца. Т.е. после определенного момента файл заполняется нулями (я использую fwrite, а при использовании putc он с этого момента просто прекращает писать в файл). Из приведенного кода видно, что такого по логике происходить не может, т.к. через 2 байта обязательно записывается 1 или 2. Подскажите почему это может происходить. (вставленные мной строки заключены в //-…-)
void
decode()
{
short i;
short j;
short c;
short r;
long count;
//---------------------------------------------------------------
FILE* fstat_pos=NULL;
FILE* fpos=NULL;
uchar stat_blok[255];
char type;
char size;
char back;
int pos;
char *mas;
fstat_pos=fopen(strcat(arc_name,".psf"),"wb"); //position statistic file
//---------------------------------------------------------------
#ifdef KEEP_WINDOW
if (text == (uchar *) NULL)
text = (uchar *)malloc_msg(DDICSIZ);
#else
text = (uchar *)malloc_msg(DDICSIZ);
#endif
disp_clock();
decode_start();
count = 0;
r = 0;
//---------------------------------------------------------------
mas=malloc(origsize);
pos=0;
//---------------------------------------------------------------
while (count < origsize)
{
if ((c = decode_c()) <= UCHAR_MAX) //инструкция первого рода
{
//---------------------------------------------------------------
type=1;
size=c;
back=0;
//---------------------------------------------------------------
text[r] = (uchar) c;
count++;
if (++r >= DDICSIZ)
{
r = 0;
disp_clock();
fwrite_txt_crc(text, DDICSIZ);
}
}
else //инструкция второго рода
{
j = c - (UCHAR_MAX + 1 - THRESHOLD);
count += j;
i = decode_p();
//---------------------------------------------------------------
type=2;
size=j;
back=i;
//---------------------------------------------------------------
if ((i = r - i - 1) < 0)
i += DDICSIZ;
if (r > i && r < DDICSIZ - MAXMATCH - 1)
{
while (--j >= 0)
{
text[r++] = text[i++];
}
}
else
{
while (--j >= 0)
{
text[r] = text[i];
if (++r >= DDICSIZ)
{
r = 0;
disp_clock();
fwrite_txt_crc(text, DDICSIZ);
}
if (++i >= DDICSIZ)
i = 0;
}
}
}
//---------------------------------------------------------------
mas[pos++]=type;
mas[pos++]=size;
mas[pos++]=back;
//---------------------------------------------------------------
}
//---------------------------------------------------------------
fwrite(mas,1,origsize,fstat_pos);
fclose(fstat_pos);
//---------------------------------------------------------------
if (r != 0)
fwrite_txt_crc(text, r);
#ifndef KEEP_WINDOW
free((char *)text);
#endif
}
|