Чтение бинарного файла на си

В файле записана структура в бинарном виде, сначала идет массив char(слово), потом число и все это повторяется с новой строки, количество которых известно заранее. Вопрос простой и одновременно сложный, а как собственно считать эти значения (пишу их в структуру), пока не выходит как я написал.

 // структура
    
    struct st
    {
        char* nam;
        int count;
    };
    // сама запись в файл
     FILE* fp = fopen("file.bin", "wb+");
        char new_str = '\n';
        if (fp == NULL) {
            printf("Can't open file\n");
            return;
        }
        for (int i = 0; i < size; i++) {
            fwrite(&(st[i].nam), sizeof(char), strlen(st[i].nam), fp);
            fwrite(&(st[i].count), sizeof(int), 1, fp);
            fwrite(&(new_str), sizeof(char), 1, fp);
        }
        fclose(fp);
    
        FILE* fp = fopen("file.bin", "rb");
            if (fp == NULL) {
                printf("Can't open file\n");
                return;
            }
            rewind(fp);
            for (int i = 0; i < size; i++) {
                fread(&(st[i].nam), sizeof(char), strlen(st[i].nam), fp);
                fread(&(st[i].count), sizeof(int), 1, fp);
            }
            fclose(fp);

Ответы (1 шт):

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

Надо при записи сначала писать число выводимых байтов строки. При чтении - читать число байтов, выделять необходимую память и уже в нее записывать.

    for (int i = 0; i < size; i++) {
        int len = strlen(st[i].nam);
        fwrite(&len,sizeof(len),1,fp);
        fwrite(st[i].nam, sizeof(char), len, fp);
        fwrite(&(st[i].count), sizeof(int), 1, fp);
    }

Чтение:

      for (int i = 0; i < size; i++) {
            int len;
            fread(&len,sizeof(len),1,fp);
            st[i].nam = (char*)calloc(len+1);
            fread(st[i].nam, sizeof(char), len, fp);
            fread(&(st[i].count), sizeof(int), 1, fp);
        }

В пределах одной программы, когда все указатели на месте и указывают на строки с выделенной памятью - может проскочить неверное чтение. Чтобы действительно убедиться что все верно, писать надо в одной программе, а читать в другой.

→ Ссылка