Question

I'm doing a school project about maintaining a personal Database. but my tutors didn't explained the practice, they explained the theory(Data structures and such) not how to code in c.

We where given a certain amount of tables, indexes and consults they wanted to solved and we are to program the data structures that run behind.

I chose a hash-table to keep the data and b+trees for the secondary indexes.


Well the b+ trees I can keep them in RAM but the hash table I must be able to maintain it in the hard disk. So I'm using the fwrite() function to keep it in disk. But I found a problem. I don't know how to write the entire bucket into disk with a single fwrite instruction (This is one of the few requirements I was given).


the code I have for initializing the structure

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

And this are my structures

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;

The problem that I'm experiencing is that when I try to write a bucket. the bucket size is only 8(cos of the 2 pointers) but I can't make those two pointer vectors[] because I have to calculate those values once the program has already started. And for what I read, there isn't a way to resize vectors, because they change place in the memory.

The only solution I can think of is to load the whole bucket into a char array(kind of a buffer) and then write it to memory.

Any ideas?

Was it helpful?

Solution

What you're doing is generally called serialization, if that helps you Google more info.

Now, in this case, your first struct:

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

Is made up of 2 pointers. Pointers won't necessarily be valid over a save-load cycle (you can usually count on them not to be), so you don't need to save those. Instead, you'll want to write the contents of those two structs to the file. Luckily, you almost made this easy for yourself. You know the address (from the pointer), so just use:

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

which will write n bytes (the size of one record), starting at the given pointer.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top