История изменений
Исправление
gh0stwizard,
(текущая версия)
:
Я переделал read_database чтобы он возращал ссылку на структуру. Во-первых, сократилось выделение памяти, во-вторых, старые данные не нужно занулять, а если подсунут другой файл с другим размером rows_size, то все будет чики-пуки. Вот ее код:
struct Database *
read_database(const char *filename)
{
FILE *fp;
int rc = 0;
struct Database *db = malloc(sizeof(*db));
assert(db);
fp = fopen(filename, "r+b");
assert(fp);
rc = fread(db, sizeof(*db), 1, fp);
assert(rc == 1);
// refresh
db->rows = calloc(db->rows_size, sizeof(db->rows[0]));
rc = fread(db->rows, sizeof(db->rows[0]), db->rows_size, fp);
assert(rc == db->rows_size);
rc = fclose(fp);
assert(rc != EOF);
return db;
}
P.S. Имя для нее лучше взять open_database(), но не суть.
Исходная версия
gh0stwizard,
:
Я переделал read_database чтобы он возращал ссылку на структуру. Во-первых, сократилось выделение памяти, во-вторых, старые данные не нужно занулять, а если подсунут другой файл с другим размером rows_size, то все будет чики-пуки. Вот ее код:
struct Database *
read_database(const char *filename)
{
FILE *fp;
int rc = 0;
struct Database *db = malloc(sizeof(*db));
assert(db);
fp = fopen(filename, "r+b");
assert(fp);
rc = fread(db, sizeof(*db), 1, fp);
assert(rc == 1);
// refresh
db->rows = calloc(db->rows_size, sizeof(db->rows[0]));
rc = fread(db->rows, sizeof(db->rows[0]), db->rows_size, fp);
assert(rc == db->rows_size);
rc = fclose(fp);
assert(rc != EOF);
return db;
}