Ftell возвращает неправильный размер двоичного файла в C - PullRequest
0 голосов
/ 14 декабря 2018

Я хочу получить число байтов с помощью ftell для чтения данных из моего двоичного файла, а ftell возвращает 108 байтов вместо 144 (фактический размер моего двоичного файла)
Здесь я создаю двоичный файл:

void database_add(char *moviestxt_filename, char *database_filename)
{
    FILE *txt = fopen(moviestxt_filename,"r");
    FILE *bin = fopen(database_filename,"wb");
    if(bin == NULL) { printf("Binary file open error\n"); return 0;}`    
    if(txt == NULL) {printf("txt file open error\n"); return 0;}
    movie m; int i=1;
    while(1)
{
        fscanf(txt,"%s",&m.title);
        fscanf(txt,"%d",&m.relese_year);
        fscanf(txt,"%f",&m.imdb_rate);
        fscanf(txt,"%d",&m.duration.hours);
        fscanf(txt,"%d",&m.duration.minutes);
        fseek(bin, 0 , SEEK_END);
        fwrite(&m, sizeof(m), 1, bin); 
        if(feof(txt)) break;
    }
}

Вот функция, в которой я хочу прочитать двоичный файл:

movie* database_read(char *database_filename)
{
    FILE *bin = fopen(database_filename,"rb");
    if(bin == NULL){printf("Binary file open error\n"); return 0;}
    fseek(bin, 0, SEEK_END);
    int size = ftell(bin); //Here I get the wrong size
 // ......
}

Вот моя основная функция:

int main()
{
     movie *v;
     database_add("movies.txt","db");
     v = database_read("db");
     return 0;
}

1 Ответ

0 голосов
/ 14 декабря 2018

Проблема в том, что вы никогда не очищаете и не закрываете выходной файл.Некоторые данные останутся в буфере.

Также это приводит к утечке файловых дескрипторов, что тоже плохо.

Добавить в конец функции database_add:

fclose(txt); // read-only file, ignore close error
if (fclose(bin) == -1) {
    perror("closing output file");
    // exit program or return error code or something
}
...