2013-07-11 25 views
29

Hat jemand ein Beispiel für Code, der in eine Binärdatei schreiben kann. Und auch Code, der eine Binärdatei lesen und auf dem Bildschirm ausgeben kann. Wenn ich Beispiele anschaue, kann ich in eine Datei schreiben. Aber wenn ich versuche, von einer Datei zu lesen, wird sie nicht korrekt ausgegeben.Lesen/Schreiben in Binärdateien in C

+9

können Sie Ihren Code zeigen? – chrisaycock

+1

Das Internet wird viele Beispiele haben. Wie gibst du die Daten aus? Vielleicht ist das falsch. – doctorlove

Antwort

60

Lesen und binäre Dateien zu schreiben ist so ziemlich das gleiche wie jede andere Datei, der einzige Unterschied ist, wie Sie es öffnen:

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 

Sie sagten, Sie es lesen kann, aber es ist nicht richtig ausgibt ... bedenken Sie, dass, wenn Sie „Ausgang“ diese Daten, sind Sie nicht ASCII zu lesen, so dass er einen String auf den Bildschirm aus ist nicht, wie:

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

in eine Datei zu schreiben, ist so ziemlich die gleiche, mit der Ausnahme, dass Sie fwrite() anstelle vonverwenden:

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 

Da wir Linux reden .. gibt es eine einfache Möglichkeit, eine Plausibilitätsprüfung zu tun. Installieren Sie hexdump auf Ihrem System (wenn es dort nicht schon ist) und Dump-Dateien:

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

Jetzt vergleichen Sie das mit Ihrer Ausgabe:

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

hmm, vielleicht die printf ein %x ändern zu machen dies ein wenig klarer:

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

Hey, schau! Die Daten entsprechen jetzt *. Super, wir müssen die Binärdatei korrekt lesen!

* Anmerkung werden die Bytes nur auf den Ausgang vertauscht aber, dass die Daten korrekt sind, können Sie für diese Art der Sache anpassen

+1

ich weiß, ist alt, aber es gibt einige Fragen, die ich machen muss: "// schreibe 10 Bytes in unseren Puffer" bedeutet, dass speichert, was in Ihrem Puffer in Ihrer Datei ist? – Gaunt

+1

@Gaunt - Ja, ich hätte "von" sagen sollen, um das klarer zu machen; Das habe ich jetzt behoben. In diesem Beispiel gehe ich davon aus, dass "buffer" existiert und mit einigen Daten gefüllt ist, die in "test.bin" geschrieben werden, wie von 'write_ptr' gezeigt wird. Wenn Sie das ausführen, könnten Sie dann die Datei test.bin "hexdump" und diese Bytes darin sehen. – Mike

+2

Beachten Sie, dass unter Linux (und auf Unix-basierten Systemen im Allgemeinen) das Flag "b" optional ist - auf solchen Systemen wird nicht zwischen einer Binärdatei und einer Textdatei unterschieden. Der Unterschied ist jedoch sehr wichtig für Windows. Wenn Ihr Code Anspruch auf Portabilität hat, fügen Sie 'b' hinzu, wenn Sie die Datei als Binärdatei behandeln. –