Domanda

che sto facendo un progetto scolastico di mantenere un database personale. ma i miei tutori non hanno spiegato la pratica, hanno spiegato la teoria (Strutture dati e simili), non come codice in C.

dove abbiamo dato una certa quantità di tabelle, indici e si consulta volevano risolvere e noi siamo per programmare le strutture di dati che corrono dietro.

ho scelto un hash-table per mantenere i dati e gli alberi B + per gli indici secondari.


Bene gli alberi B + li posso tenere in RAM, ma la tabella hash devo essere in grado di mantenere nel disco rigido. Così sto usando la funzione fwrite () per tenerlo in disco. Ma ho trovato un problema. Non so come scrivere l'intero secchio nel disco con una singola istruzione fwrite (Questo è uno dei pochi requisiti mi è stata data).


il codice che ho per inizializzare la struttura

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

E questo sono i miei strutture

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;

Il problema che sto vivendo è che quando provo a scrivere un secchio. la dimensione del secchio è a soli 8 (cos dei 2 puntatori) ma non riesco a fare quei due vettori puntatore [] perché devo calcolare questi valori una volta che il programma è già iniziato. E per quello che ho letto, non c'è un modo per ridimensionare vettori, perché cambiano posto nella memoria.

L'unica soluzione che posso pensare è quello di caricare l'intera secchio in una matrice di char (specie di buffer) e poi scrivere nella memoria.

Tutte le idee?

È stato utile?

Soluzione

Quello che stai facendo è generalmente chiamato serializzazione, se questo ti aiuta a Google ulteriori informazioni.

Ora, in questo caso, il vostro primo struct:

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

è composta da 2 puntatori. Puntatori non saranno necessariamente valida nel corso di un ciclo di Save-carico (di solito si può contare su di loro per non essere), quindi non c'è bisogno di salvare quelli. Invece, ti consigliamo di scrivere il contenuto di questi due struct al file. Per fortuna, è quasi fatto questo facile per voi stessi. Si conosce l'indirizzo (dal puntatore), quindi basta usare:

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

che scrivere n byte (la dimensione di un record), a partire dalla data puntatore.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top