Как можно определить последний символ в файле?
У меня есть бинарный файл неизвестного размера. В нем находится текст в бинарном виде, зашифрованный по алгоритму LZW
Для теста я взял строку abacabadabacabae как в примере выше. После сжатия я получил такой файл с бинарным кодом
6100 0000 6200 0000 6100 0000 6300 0000
0001 0000 6100 0000 6400 0000 0401 0000
0301 0000 0101 0000
Как видно последний код — 0101 0000 или 101 (e). Поэтому можно сделать вывод, что сжатие текста правильное. Моя процедура декомпрессии по алгоритму возвращает мне строку abacabadabacababa вместо abacabadabacabae, то есть почему-то не считывает последний код.
Я попробовал отследить последний символ в файле вручную внутри цикла декомпрессии, но это не помогло. Вот мое условие:
while (!feof(inFile)){
if (feof(inFile)-ftell(inFile)==1){
fread(&codeInFile, sizeof(int), 1, inFile);
fprintf(outFile, "%s", codeInFile);
break;
}
...
}
Есть еще вариант, но это условие тоже не отрабатывает
fseek(inFile , 0 , SEEK_END);
long fileSize = ftell(inFile);
rewind(inFile);
while (!feof(inFile)){
if (ftell(inFile)== (fileSize-1)){
fread(&codeInFile, sizeof(int), 1, inFile);
printf("%s", codeInFile);
break;
}
}
Как еще можно отследить последний символ в файле?
Ответы (2 шт):
Просто чтоб показать вариант чтения:
FILE * f = fopen("data","rb");
fseek(f,0,SEEK_END);
int sz = ftell(f);
fseek(f,0,SEEK_SET);
printf("size of file - %d bytes\n",sz);
for(int i, pos = 0; fread(&i,sizeof(i),1,f) == 1; pos+=4)
{
if (pos == sz-4) puts("Last int: ");
printf("At pos %3d : 0x%08X\n", pos, i);
}
fclose(f);
Этот код у меня честно читал из 40-байтного файла 10 int'ов. Посмотрите, может, чем поможет...
Я решил проблему. Спасибо Harry за наводку в комментариях. Проблема была в функции сжатия. Чтоб записать код последнего символа в файл я прописал в функции сжатия:
int stop;
while (!feof(inFile)){
if (stop = fread(¤tCharCode, 1, 1, inFile) !=1){
fwrite(¤tCharCode, sizeof(int), 1, outFile);
break;
}
...
}
А в функции распаковки
int stop;
while (!feof(inFile)){
stop = fread(&codeInFile, sizeof(int), 1, inFile);
if (stop != 1) break;
...
}
То есть, если fread вернула не количество успешно считанных объектов, а что-то другое, то был достигнут конец файла и в первом аргументе fread()находится последний блок памяти, который нам нужен. В сжатии — один последний байт, в процедуре разжатия — 4 байта.