2013-07-11 25 views
29

Qualcuno ha un esempio di codice che può scrivere su un file binario. E anche il codice che può leggere un file binario e l'output sullo schermo. Guardando gli esempi, posso scrivere su un file ok, ma quando provo a leggere da un file, non viene emesso correttamente.Lettura/scrittura su file binari in C

+9

Potete mostrare il codice? – chrisaycock

+1

Internet avrà un sacco di esempi. Come stai emettendo i dati? Forse è sbagliato. – doctorlove

risposta

60

di lettura e scrittura di file binari è più o meno la stessa di qualsiasi altro file, l'unica differenza è come lo si apre:

unsigned char buffer[10]; 
FILE *ptr; 

ptr = fopen("test.bin","rb"); // r for read, b for binary 

fread(buffer,sizeof(buffer),1,ptr); // read 10 bytes to our buffer 

Lei ha detto si può leggere, ma non è l'output correttamente ... tenere presente che quando si "uscita" questi dati, non stai leggendo ASCII, quindi non è come la stampa di una stringa sullo schermo:

for(int i = 0; i<10; i++) 
    printf("%u ", buffer[i]); // prints a series of bytes 

scrittura su un file è praticamente la stessa, con l'eccezione che stai utilizzando fwrite() anziché fread():

FILE *write_ptr; 

write_ptr = fopen("test.bin","wb"); // w for write, b for binary 

fwrite(buffer,sizeof(buffer),1,write_ptr); // write 10 bytes from our buffer 

Visto che stiamo parlando di Linux .. c'è un modo semplice per fare un controllo di integrità. Installare hexdump sul vostro sistema (se non è già in là) e scaricare il file:

[email protected]:~/C$ hexdump test.bin 
0000000 457f 464c 0102 0001 0000 0000 0000 0000 
0000010 0001 003e 0001 0000 0000 0000 0000 0000 
... 

Ora si confronti con l'output:

[email protected]:~/C$ ./a.out 
127 69 76 70 2 1 1 0 0 0 

hmm, forse cambiare il printf ad un %x fare questo un po 'più chiaro:

[email protected]:~/C$ ./a.out 
7F 45 4C 46 2 1 1 0 0 0 

Ehi, guarda! I dati corrispondono ora *. Fantastico, dobbiamo leggere correttamente il file binario!

* Nota i byte vengono scambiati solo sull'uscita ma che dati sono corretti, è possibile regolare per questo genere di cose

+1

so che è vecchio, ma ci sono alcune domande che devo fare: "// scrivere 10 byte nel nostro buffer" significa che salva ciò che è nel buffer del tuo file? – Gaunt

+1

@Gaunt - Sì, avrei dovuto dire "da" per renderlo più chiaro; L'ho risolto ora. In questo esempio suppongo che esista un "buffer" e che sia compilato con alcuni dati e che venga scritto su "test.bin" come indicato da 'write_ptr'. Se lo esegui, puoi "hexdump" il file test.bin e vedere quei byte in esso contenuti. – Mike

+2

Nota che su Linux (e generalmente su sistemi basati su Unix), il flag 'b' è 'opzionale' - non c'è distinzione tra un file binario e un file di testo su tali sistemi. La differenza conta molto su Windows, però. Se il tuo codice ha pretese di portabilità, aggiungi il 'b' quando hai intenzione di trattare il file come un file binario. –