2016-07-24 25 views
-1

Ich versuche, die Ausgabe an den folgenden Code, um herauszufinden:Datei-Handling in C - unerwarteter Ausgang

#include <stdio.h> 

int main() 
{ 
    FILE *f; 
    int i = 20; 
    if ((f = fopen("file.DAT", "wb")) != NULL) { 
     fwrite(&i, 4, 1, f); 
     fclose(f); 
    } 
    return 0; 
} 

Auf einem 32-bit-System, ein paragraph sign (dezimal ascii Wert 182) auf binäre Datei geschrieben.

Frage: Wie bestimmt man, welcher ascii Wert in Binärdatei geschrieben wird?

Das erste Argument der Funktion fwrite ist ein Zeiger auf Array, aber Array ist nicht im Code definiert. Wie verfolge ich, welche Bytes in eine Binärdatei geschrieben wurden?

+2

Es sollte einen Raum und drei NUL Bytes (auf den meisten Plattformen Ich bin mir dessen bewusst) schreiben. Kein Absatzzeichen mit dem ASCII-Wert 182. – immibis

+0

'& i' bedeutet ein Zeiger auf' i', da 'i' eine Ganzzahl ist, schreiben Sie richtig 4 Byte Speicher von der Adresse, auf die von' i' zu 'file.DAT' gezeigt wird –

+3

@immibis: nur für einen Wert '0x20', nicht für eine * Dezimalstelle *' 20' :) Die Interpretation von '20' als Zeichen hängt davon ab, mit welcher Software Sie es betrachten. – usr2564301

Antwort

2

Dieser Code schreibt die interne Darstellung der inti in die Datei file.DAT im Binärmodus geöffnet. &i ist nicht die Adresse eines Arrays, sondern die Adresse der lokalen Variablen i. fwrite schreibt die 4 Bytes an dieser Adresse, die auf einem 32-Bit-System die fragliche ganze Zahl bilden.

+---------------------------+ 
| 0x14 | 0x00 | 0x00 | 0x00 | 
+---------------------------+ 

Aber auf einer Big-Endian-Maschine, wie der älteren Macs, würde der Inhalt der Datei sein:

auf Little-Endian-Architekturen wie Intel-PC und Macs, Datei 4 Bytes mit Werten enthalten:

+---------------------------+ 
| 0x00 | 0x00 | 0x00 | 0x14 | 
+---------------------------+ 

Wenn Sie diese Datei an das Terminal ausdrucken oder in einen Editor geladen werden, könnte man ein komisches Zeichen für die nicht-ASCII-Wert 0x14 und anderen Marken oder keine für die null-Bytes sehen. Dieses Zeichen wird als Absatzzeichen angezeigt, möglicherweise weil der Editor eine Art Zeichensatzkonvertierung durchführt. Verwenden Sie ein Binärdump-Dienstprogramm, um den genauen Inhalt der Datei anzuzeigen.

Weitere Portabilität, sollte der Code gelesen fwrite(&i, sizeof i, 1, f);