PDA

Visualizza la versione completa : read vs fread


puntino
10-06-2008, 22:11
Ciao

qualcuno mi potrebbe spiegare la differenza che esiste fra una read e una fread oppure in maniera equivalente fwrite e write ?
Se devo leggere un file che è stato riempito attraverso dei bit generati in maniera casuale quale mi conviene usare ?
Ciao e grazie

mondobimbi
10-06-2008, 22:28
read e write sono chiamate di sistema, normalmente non dovresti usarle.

ciao

sergio

puntino
10-06-2008, 23:16
perchè non dpvrei usarle ?

MItaly
10-06-2008, 23:24
Perché non sono portabili, senza contare che se non sbaglio la write non è bufferizzata, e quindi è più lenta.

mondobimbi
11-06-2008, 08:50
Originariamente inviato da puntino
perchè non dpvrei usarle ?
se vuoi le puoi usare nessuno te lo vieta, sono funzioni di basso livello: come ti ha detto Mitaly non sono bufferizzate, inoltre la struttura FILE ritornata dalla fopen ingloba molte informazioni utili del file che altrimenti ti devi ricavare da te, mentre la open ritorna il descrittore di file che non è che un intero.
ciao
sergio

puntino
11-06-2008, 08:52
grazie ad entrambi

mondobimbi
11-06-2008, 08:55
aggiungo solo che la fread e fwrite sono costruite sulla read e write.
ciao
sergio

menphisx
11-06-2008, 23:52
Originariamente inviato da MItaly
Perché non sono portabili, senza contare che se non sbaglio la write non è bufferizzata, e quindi è più lenta.

Come può essere più lenta se fwrite richiama write ?

mondobimbi
12-06-2008, 07:54
dipende, se si legge o si scrive un carattere solo hai ragione altrimenti la fread e fwrite è più veloce perchè utilizza blocchi di memoria di dimensioni adatti al sistema su cui opera per minimizzare il numero di chiamate di sistema che sono le più costose.
Per esempio guarda questa implementazione di getchar


int getchar () {

static char buffer[BUFSIZ];
static char * ptr_buf = buffer;
static n_char = 0;

// verifica se il buffer è vuoto
if ( !n_char ) {
// legge dallo stdin <0>
n_char = read (0, buffer, sizeof ( buffer ) );
// riposiziona il puntatore all'inizio del buffer
ptr_buf = buffer;
}
return (--n_char >= 0) ? (unsigned char) *ptr_buf++ : EOF;

}

viene eseguita una unica chiamata di sistema per tutta la dimensione di buffer (BUFSIZE è definito in syscalls.h) e poi si svuota via via il buffer.
ciao
sergio

puntino
12-06-2008, 20:11
Grazie per l'esempio

Loading