Newsgroup: it.comp.lang.c
Titolo: creazione file per scrittura ad accesso casuale

devo creare un file che sia ad accesso casuale in lettura/scrittura.
Per creare tale file note le dimensioni run-time lo creo con una open
e con un ciclo di fwrite, dopodiché lo apro in modalità "r+b"
per scriverci in maniera casuale.
Vorrei sapere se esiste un modo più veloce per creare tale file.
Il problema sta nelle dimensioni che sono > di 40 Mb creandolo con un ciclo
di fwrite impiega un pò troppo.
Un altro problema legato a tale file è relativo alle dimensioni degli elementi
della struttura che devo andare a scriverci.
La struttura è composta da 3 membri di tipo:
unsigned char
unsigned char
long int
se faccio il sizeof di ciascun membro ottengo le dimensioni corrette 1, 1, 4
ma se faccio il sizeof della struttura ottengo una dimensione pari a 8 byte.
Qualche suggerimento?
TIA
Gianluca
-- 
================================================================================
TO REPLY
CHANGE 
NOS...@technologist.com
 IN ingv at 
technologist.com
"...Unix, MS-DOS, and Windows NT (also known as the 
    Good, the Bad, and the Ugly)."                     (by Matt Welsh)

 Qualche suggerimento?
smanetta con le opzioni del tuo compilatore ed elimina l'allineamento a word
dei dati (o doppia word in questo caso).
ciao
donCiccio

 dimensione pari a 8 byte. Qualche suggerimento?
normale
la struttura viene allineata per farla stare in uno spazio di memoria 
multiplo di 4 byte, deve fare cosě o non puň farcele stare le variabili 
nei registri. Quei due char sono "sbagliati". Sballano l'allineamento, 
cosě il compilatore li forza in uno spazio di 4 byte. In altri 
linguaggi, se hai un record non allineato ma lo vuoi comunque contiguo, 
puoi dichiararlo come "packed record", in C non saprei

 Qualche suggerimento?
E' normale. Si tratta della questione dell'allineamento. Il compilatore
può inserire bytes in più per motivi di efficienza. Se la cosa ti porta
problemi dovresti cercare nella documentazione del tuo compilatore se è
possibile disabilitare tale comportamento.
EMG

possibile disabilitare tale comportamento.
Non è che ci capisco molto sono alle prime armi:(
Nella documentazione del gcc ho trovato questa opzione:
`-fpack-struct'
     Pack all structure members together without holes.  Usually you
     would not want to use this option, since it makes the code
     suboptimal, and the offsets of structure members won't agree with
     system libraries.
è questa l'opzione che mi avete suggerito ??
TIA
Gianluca
P.S.
Ho riunito in un'unico messaggio quanto suggeritomi nelle precedenti repliche:)


 è questa l'opzione che mi avete suggerito ??
Esatto.
EMG


e' un modo. Non il migliore perche' cosi' cambi l'allineamento
delle strutture sempre. il che puo' comportare che strutture utilizzate
da te che sembrano essere uguali a strutture di sistema NON lo siano.
Non e' una cosa che si usi spessissimo, ma puo' capitare.
E' meglio se usi le direttive di precompilazione:
#pragma pack (1)
che per gcc su linux e c unix digital (di questi sono sicurissimo) e
probabilmente per la gran parte dei compilatori C, pone le strutture
seguenti allineate al byte (cioe' senza buchi).
Ovviamente se metti 2 allinea a 16 bit, 4 a int ecc ecc...
Cosi' puoi avere piu' controllo. Strutture allineate come ti pare.
E se necessario in modo diverso da un punto all'altro del programma.
                                    Andrea Zaghi