2012-04-05 15 views
0

Ich habe eine Funktion wie folgt definiert:eine ganze Zahl als Hex in eine Datei Schreiben mit ofstream

void AddHeadCode(std::ofstream &ostream, size_t length){ 
ostream.write((char*)length, sizeof(length)); 
ostream.seekp(0x10L, std::ios::beg); 
} 

Nun, wenn dies ausgeführt wird, wird es offensichtlich ... nicht wie der char Zeiger nirgends verweisen. Aber ich möchte den tatsächlichen Zeigerwert in die Datei geschrieben. Wie Länge = 19152 Wenn ich dann die Datei in einem HEX-Editor öffne, sollte ich dort 0d4a finden.

Wie kann dies in C++ erreicht werden? Im irgendwie hier verloren ...

Antwort

5

Nehmen Sie die Adresse Ihrer length Variable, und geben Sie die Adresse an .write:

void AddHeadCode(std::ofstream &ostream, size_t length){ 
    // by popular demand, removed C-style cast 
    ostream.write(reinterpret_cast<char*>(&length), sizeof(length)); 
    ostream.seekp(0x10L, std::ios::beg); 
} 

Aber dies in der Regel nicht als das Schreiben eine ganze Zahl refered auf „als Hex“. Dies wird manchmal als Schreiben einer ganzen Zahl "als binär" oder einfaches Schreiben einer ganzen Zahl bezeichnet.

Beachten Sie, dass das, was Sie getan haben, keine tragbare Praxis ist. Wenn Sie den Wert auf einem anderen Computer (oder sogar auf demselben Computer, aber mit einem anderen Compiler) wieder einlesen, lesen Sie möglicherweise nicht denselben Wert.

+4

ich würde 'reinterpret_cast (& Länge)'. – ipc

+0

Hah, danke ... ich war blind :) – xen

+2

@Rob: reinterpret! – Anonymous

0

Filestreams heikel sind, so bin ich unsicher darüber, aber ich benutze diese für stringstreams:

std::basic_stringstream<wchar_t> oTmpStream; 
oTmpStream << L"0x" << std::nouppercase << std::setfill(L'0') << std::hex << std::setw(8) << iSomeValue 

// or without fancy formatting; 
oTmpStream << std::hex << iSomeValue