C неизвестное количество структур в файле - PullRequest
0 голосов
/ 17 января 2019

Аналогично , это .Но что, если MAX_BOOKS также будет неизвестно?

Я хочу получить количество структур из файла.

Моя структура:

typedef struct material {
    int mat_cislo;                      
    char oznaceni[MAX_TEXT];            
    char mat_dodavatel[MAX_TEXT];       
    char dodavatel[MAX_TEXT];           
    float cena;                         
    int mat_kusovnik;                   
} MATERIAL;

Мой код:

void nacist_material() {
FILE* pSoubor;
MATERIAL materialy_pocitadlo;
int i;
int b;
if((pSoubor = fopen(SOUBOR_MATERIAL, "rb")) == NULL ) {
    printf("\nChyba při čtení souboru");
    return;   
}

pocet_zaznamu_materialu = 3;

printf("\n\n===>%d", pocet_zaznamu_materialu);
if(pocet_zaznamu_materialu > 0) {
    printf("\nExistuje %d materialu", pocet_zaznamu_materialu);


    free(pMaterialy);

    pMaterialy = (MATERIAL *) malloc(pocet_zaznamu_materialu * sizeof(MATERIAL));

    for(i = 0; i < pocet_zaznamu_materialu; i++) {
        b = fread(&pMaterialy[i], sizeof(MATERIAL), 1, pSoubor);  
    }
    printf("\n otrava %d", b); 
}
else {
    printf("\nNeexistuje předchozí záznam materialu");
}
fclose(pSoubor);
return;

}

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

Проблема: мне нужно знать - количество структур в файле, как это сделать?

Спасибо, извините за eng

Ответы [ 3 ]

0 голосов
/ 17 января 2019

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

В этом случае обычной идиомой является использование динамически распределенного массива структур произвольного размера, а затем увеличение его с помощью realloc при каждом заполнении текущего выделенного массива. Например, вы можете сделать новый размер в два раза больше предыдущего.

Именно так векторы C ++ управляют своим базовым массивом изнутри.

0 голосов
/ 17 января 2019

Рассматривали ли вы добавление заголовка в файл?

То есть, поместите специальную структуру в начале файла, которая сообщает вам некоторую информацию о файле. Что-то вроде ...

struct file_header {
    char      id[32];        /* Let this contain a special identifying string */
    uint32_t  version;       /* version number in case the file structure changes */
    uint32_t  num_material;  /* number of material structures in file */
};

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

Если хотите, можете даже включить проверку ошибок.

0 голосов
/ 17 января 2019

Если файл состоит только из списка желаемых struct, хранимых непрерывно, то размер файла в байтах будет кратным размеру вашей структуры, и вы можете получить размер файла, а затем количество структур в файле примерно так:

size_t len_file, num_structs;

fseek(fp, 0, SEEK_END);
len_file = ftell(fp);
rewind(fp);

num_structs = len_file/sizeof(MYSTRUCT);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...