LINUX.ORG.RU

История изменений

Исправление 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;
}
С учетом этого, поставленные задачи решаются. Когда создается файл БД используем один вариант (make_database), для других функций программы (чтение, изменение строк) используется read_database().

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;
}
С учетом этого, поставленные задачи решаются. Когда создается файл БД используем один вариант (make_database), для других функций программы (чтение, изменение строк) используется read_database().