2013-10-16 6 views
5

Ho dubbi su quale ordine della dimensione e del conteggio dei parametri utilizzare per fread/fwrite. Se voglio leggere 8kb di dati dal file fp, quale dei seguenti è più efficiente?dimensioni di fread/fwrite e conteggio

fread(data,1,8192,fp) 
fread(data,8192,1,fp) 

Ci sono anche problemi di endianità di cui dovrei preoccuparmi?

risposta

11

Sono esattamente equivalenti. Per quanto riguarda l'endianità, dipende da cosa stai leggendo. Normalmente, sarà un buffer di byte, che dovrete quindi "unformat", in base al formato con cui sono stati scritti. E poiché è byte, l'endianità non ha alcun ruolo.

EDIT:

Come simonc rilevare (e quindi eliminato, perché non ha ottenuto il 100% a destra --- ma il suo punto era valido): c'è una differenza per quanto riguarda il valore di ritorno (che è necessario utilizzare per sapere se la funzione ha funzionato o meno). fread(buffer, 8192, 1, fp) restituirà 0 o 1 e 1 solo se sono stati letti tutti gli 8192 byte. Inoltre, Posix dice che il contenuto del buffer non è specificato per oggetti parzialmente letti. In pratica, il buffer sarà stato riempito con il numero di byte che è possibile leggere, ma dal momento che non sai quanti sono, non ti comprano molto. In breve, dovresti sempre usare fread(buffer, 1, 8192, fp); (dato che non ha senso usare questa funzione solo per un buffer di byte).

+0

Bene, dato che sono byte, ovviamente l'endianità giocherà un ruolo. Immagina che stia cercando di leggere questi 8kb di dati in una struttura che ha membri 'int', per esempio. Si presume che stia cercando di fare qualcosa come 'char string [] = fread (data, 8192,1, fp);' – fvdalcin

+3

@fvdalcin Legge i byte. I byte non hanno endianness. Una volta che li ha letti, deve interpretarli secondo le specifiche del formato di file. Questo dovrebbe normalmente essere fatto senza considerazioni di endianness. –

+0

@fvdalcin E sì, l'unico uso ragionevole di queste funzioni è 'char buffer non firmato [8192]; fread (buffer, 8192, 1, fp); '. Successivamente, è necessario interpretare il buffer, in base al formato di file specificato. –

2

Non sono esattamente equivalenti.

fread() è stato progettato male. Il suo design ignora la possibilità di una lettura parziale alla fine del file, che non può essere espressa dal suo valore di ritorno, che è in unità della dimensione specificata.

Si dovrebbe usare solo fread() dove la dimensione è 1 e la lunghezza è il numero di byte che si prevede. Questo è l'unico modo per affrontare adeguatamente la situazione. Per tipi diversi da char che significa fornire sizeof char come dimensione e n*sizeof T come lunghezza, dove n è il numero di T s che ci si aspetta.