2016-04-13 24 views
0

In meinem Projekt muss ich in sequenzielle unsigned Ints Binärdatei schreiben, und es ist wichtig, dass jede Zahl genau 4 Bytes dauert. Aber wenn ich die Binärdatei mit einem Hex-Editor öffne, sehe ich dieses seltsame Geschehen: die Zahlen werden nur bis zu Nummer 9 korrekt geschrieben; vor Nummer 10 wird er ein weiteres extra Byte hinzufügen und '13' schreiben (und schon mit meiner Datei versaut). Und seltsame Dinge passieren weiterhin - ab Nummer 30 werden verschiedene Zeichen geschrieben, eins neben jeder Zahl. warum ist das? wie man es beheben kann, zumindest das Größenproblem? Hier ist mein einfacher Beispielcode:kann nicht korrekt große unsigned Ints in Binärdatei schreiben - C++

int main() 
{ 
    string filename; 
    cin >> filename; 
    fstream mystream; 
    mystream.open(filename, ios::out); 
    if (mystream) 
     for (unsigned int i = 0; i < 3200; i++) 
      mystream.write((char*)&i, sizeof(unsigned int)); 
    mystream.close(); 

    return 0; 
} 

und angebracht ist, um ein Bild von dem, was ich in der Datei sehen: file capture on hex editor

dank

+0

Das Definieren von 'void main()' in globalen Namespae ist im Standard C++ unzulässig. Sie sollten den Standard 'int main()' verwenden. – MikeCAT

+0

rechts. Ich werde es korrigieren; –

Antwort

1

Die Zahl 10 ist ein Newline-Zeichen LF, und es wird in CRLF konvertiert, da die Datei im Textmodus geöffnet wird.

Öffnen Sie Dateien im Binärmodus, um mit Binärdateien umzugehen.

#include <iostream> 
#include <fstream> 
#include <string> 

using std::string; 
using std::cin; 
using std::fstream; 
using std::ios; 

int main() 
{ 
    string filename; 
    cin >> filename; 
    fstream mystream; 
    mystream.open(filename, ios::out | ios::binary); // add OR with ios::binary 
    if (mystream) 
     for (unsigned int i = 0; i < 3200; i++) 
      mystream.write((char*)&i, sizeof(unsigned int)); 
    mystream.close(); 
}