Запись структуры сразу в файл - PullRequest
1 голос
/ 27 июня 2010

Я делаю школьный проект по ведению персональной базы данных. но мои преподаватели не объяснили практику, они объяснили теорию (структуры данных и тому подобное), а не как кодировать в c.

Мы получили определенное количество таблиц, индексов и консультаций, которые они хотели решить, и мы должны запрограммировать структуры данных, которые работают позади.

Я выбрал хеш-таблицу для хранения данных и деревьев b + для вторичных индексов.


Ну, b + деревья, я могу хранить их в оперативной памяти, но хеш-таблицу, я должен быть в состоянии сохранить их на жестком диске. Поэтому я использую функцию fwrite (), чтобы сохранить ее на диске. Но я нашел проблему. Я не знаю, как записать все ведро на диск с помощью одной инструкции fwrite (это одно из немногих требований, которое мне было дано).


код, который у меня есть для инициализации структуры

FILE * file;
file = fopen ( "HistoriasClinicas.bin" , "wb" );
for(i=0;i<amountOfBuckets;i++)
    fwrite (Bucket , getpagesize() ,1 , file );
fclose (file);

А это мои структуры

typedef struct Hist_clin_s{
struct
{
    char codPaciente[7];
} X;
struct
{
    char codMedico[7];
    int fecha;
    char Observacion[151];
} Y;
int ptro;
}Hist_Clin;



typedef struct balde_s{
Hist_Clin *hcs;
char *waste; //Waste to make the bucket reach the page size.
}Bucket;

Проблема, с которой я сталкиваюсь, заключается в том, что, когда я пытаюсь написать ведро. размер сегмента составляет всего 8 (потому что из двух указателей), но я не могу сделать эти два вектора-указателя [], потому что я должен вычислить эти значения, как только программа уже запущена. И что я читаю, нет способа изменить размеры векторов, потому что они меняются местами в памяти.

Единственное решение, которое я могу придумать, - это загрузить целое ведро в массив символов (вид буфера) и затем записать его в память.

Есть идеи?

1 Ответ

3 голосов
/ 27 июня 2010

То, что вы делаете, обычно называется сериализацией, если это поможет вам Google больше информации.

Теперь, в этом случае, ваша первая структура:

typedef struct balde_s{
    Hist_Clin *hcs;
    char *waste; //Waste to make the bucket reach the page size.
}Bucket;

Состоит из 2 указателей. Указатели не обязательно будут действительны в течение цикла сохранения-загрузки (обычно вы можете рассчитывать на то, что они не будут), поэтому вам не нужно их сохранять. Вместо этого вы захотите записать содержимое этих двух структур в файл. К счастью, вы почти упростили это для себя. Вы знаете адрес (из указателя), поэтому просто используйте:

fwrite( (void*)something.hcs, sizeof(Hist_Clin), 1, file);

, который будет записывать n байтов (размер одной записи), начиная с указанного указателя.

...