Как можно определить последний символ в файле?

У меня есть бинарный файл неизвестного размера. В нем находится текст в бинарном виде, зашифрованный по алгоритму 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 шт):

Автор решения: Harry

Просто чтоб показать вариант чтения:

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'ов. Посмотрите, может, чем поможет...

→ Ссылка
Автор решения: Konstantin_SH

Я решил проблему. Спасибо Harry за наводку в комментариях. Проблема была в функции сжатия. Чтоб записать код последнего символа в файл я прописал в функции сжатия:

int stop;
while (!feof(inFile)){

    if (stop = fread(&currentCharCode, 1, 1, inFile) !=1){
        fwrite(&currentCharCode, sizeof(int), 1, outFile);
        break;
    }
 ...
 }

А в функции распаковки

int stop;
    while (!feof(inFile)){
    stop = fread(&codeInFile, sizeof(int), 1, inFile);
    if (stop != 1) break;
    ...
    }

То есть, если fread вернула не количество успешно считанных объектов, а что-то другое, то был достигнут конец файла и в первом аргументе fread()находится последний блок памяти, который нам нужен. В сжатии — один последний байт, в процедуре разжатия — 4 байта.

→ Ссылка