C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Schreiben und Lesen von Hex-Zahlen

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Torsten Hensel
Guest





PostPosted: Tue Dec 16, 2003 1:45 pm    Post subject: Schreiben und Lesen von Hex-Zahlen Reply with quote



Hi!

Ich möchte eine Zahl (unsigned long) zuerst als Hex-Wert in eine Datei
speichern und danach lesen. Dies mache ich folgendermaßen:

[code]
#include <fstream>
#include <iostream>
#include <iomanip>
int main()
{
// write file
std::ofstream outFile("filename", std::ios::out | std::ios::trunc);
outFile << std::hex << std::setfill('0') << std::setw(Cool <<
86767492;
outFile.close();
// read file
long readValue;
std::ifstream CompFile("filename", std::ios::in);
CompFile >> std::hex >> readValue; std::cout << readValue <<
std::endl;
CompFile.close();
}

Nach diesem Programm steh in filename korrekt "052bf784" drin, und es
wird auch 86767492 ausgegeben.

Wenn ich nun aber vor dem Lesen der Datei den Inhalt von "052bf784"
auf "12052bf784" ändere liefert mir cout 3435973836, was 0xCCCCCCCC
entspricht.

Komischerweise liefert mir mein eigentliches Programm den vorigen Wert
von 86767492 zurück, solange ich es nicht neu starte. Nach einem
Neustart erhalte ich nach dem Lesen plötzlich 0.

Mein Programm enthält eine Schleife, die Eingaben abfängt, darin wird
dann die Lese-Funktion ausgeführt:

while(notDone)
{
// je nach Eingabe wird notDone gesetzt.
long readValue;
std::ifstream CompFile("filename", std::ios::in);
CompFile >> std::hex >> readValue; std::cout << readValue <<
std::endl;
CompFile.close();
}

Offensichtlich liegt mein Problem nicht am Lesen oder Schreiben der
Datei, sondern irgendwo im Umfeld. Wenn ich den ganzen Code poste
werde ich jedoch vermutlich gesteinigt (zum Teil Windows-Code, zum
Teil einfach nur elend lang)... wie kann ich die Ursache näher
eingrenzen? Welche Infos braucht ihr, damit ihr mir weiterhelfen
könnt?

Ciao
Torsten

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Thomas Maeder
Guest





PostPosted: Tue Dec 16, 2003 6:33 pm    Post subject: Re: Schreiben und Lesen von Hex-Zahlen Reply with quote



[email]hensz (AT) web (DOT) de[/email] (Torsten Hensel) writes:

Quote:
#include <fstream
#include #include

Da fehlen

#include #include <ostream>

, auch wenn die meisten C++-Implementationen nicht darauf bestehen.


Quote:
int main()
{
// write file
std::ofstream outFile("filename", std::ios::out | std::ios::trunc);
outFile << std::hex << std::setfill('0') << std::setw(Cool
86767492;
outFile.close();
// read file
long readValue;
std::ifstream CompFile("filename", std::ios::in);
CompFile >> std::hex >> readValue; std::cout << readValue
std::endl;
CompFile.close();
}

Du verwendest eine Reihe von Operationen, welche scheitern können:
- Konstruktion der Streamobjekte
- close()
- alle <<
- alle >>

Du überprüfst aber bei keiner, ob sie erfolgreich war oder nicht.

Insbesondere nicht, ob readValue korrekt eingelesen wurde. Wenn nicht,
greifst Du trotzdem lesend auf readValue zu; das hat undefiniertes
Verhalten.

Bleiben Deine Probleme bestehen, wenn Du die Operationen überprüfst und
im Fehlerfall Meldungen ausgibst, statt blind weiterzufahren?

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Tobias Wollgam
Guest





PostPosted: Tue Dec 16, 2003 6:56 pm    Post subject: Re: Schreiben und Lesen von Hex-Zahlen Reply with quote



Torsten Hensel wrote:

Quote:
// read file
long readValue;
std::ifstream CompFile("filename", std::ios::in);
CompFile >> std::hex >> readValue; std::cout << readValue
std::endl;
CompFile.close();
}
....
Wenn ich nun aber vor dem Lesen der Datei den Inhalt von "052bf784"
auf "12052bf784" ändere liefert mir cout 3435973836, was 0xCCCCCCCC
entspricht.

Könnte es sich um einen Overflow handeln? "12052bf784" paßt ja nicht in
long, wenn long 32 bit groß ist.

Gruß, Tobias

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Torsten Hensel
Guest





PostPosted: Wed Dec 17, 2003 9:23 am    Post subject: Re: Schreiben und Lesen von Hex-Zahlen Reply with quote

Thomas Maeder <maeder (AT) glue (DOT) ch> wrote:
Quote:
#include <fstream
#include #include
Da fehlen

#include #include

ok... allerdings geht es auch ohne. War das nicht die Sache, die für
den nächsten Standard beantragt ist? iostream ohne istream macht ja
wenig Sinn.

Quote:
, auch wenn die meisten C++-Implementationen nicht darauf bestehen.

Ok (hätte doch weiter lesen sollen ;-)

Quote:
int main()
{
// write file
std::ofstream outFile("filename", std::ios::out | std::ios::trunc);

Hier habe ich natürlich eine Abfrage if (!outFile.is_open()) ...

Quote:
outFile << std::hex << std::setfill('0') << std::setw(Cool
86767492;

Hier habe ich nun if (outFile.bad() || outFile.fail()) ... eingefügt.
Im if Zweig gebe ich eine Fehlermeldung aus, setze outFile.clear() und
schliesse dann den Stream - ok so?

Quote:
outFile.close();

Was macht man da? Was kann dabei denn überhaupt schief gehen?

Quote:
// read file
long readValue;
std::ifstream CompFile("filename", std::ios::in);
CompFile >> std::hex >> readValue; std::cout << readValue
std::endl;
CompFile.close();

s.o.

[Stream-Operationen]
Quote:
Du überprüfst aber bei keiner, ob sie erfolgreich war oder nicht.

Wie macht man sowas denn üblicherweise? Nach jedem >> ein if(...) ist
reichlich unübersichtlich. Gibt es dafür elegantere Methoden?

Quote:
Insbesondere nicht, ob readValue korrekt eingelesen wurde. Wenn nicht,
greifst Du trotzdem lesend auf readValue zu; das hat undefiniertes
Verhalten.

Ok, das erklärt auch, wieso ich mehr oder weniger zufällige Ergebnisse
bekomme. Also ein schönes Beispiel, wie man das nicht machen sollte...

Wobei bei korrekter Funktion des Rechners dieser Fehler nicht
auftreten kann - ich schreibe den Wert ja korrekt. Nur kann man davon
ja leider nicht ausgehen...

Quote:
Bleiben Deine Probleme bestehen, wenn Du die Operationen überprüfst und
im Fehlerfall Meldungen ausgibst, statt blind weiterzufahren?

Nein, es wurde dadurch behoben! Danke für den Hinweis... bisher sind
meine Dateizugriffe immer gut gegangen ;-)

Ciao
Torsten

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Thomas Maeder
Guest





PostPosted: Wed Dec 17, 2003 1:50 pm    Post subject: Re: Schreiben und Lesen von Hex-Zahlen Reply with quote

[email]hensz (AT) web (DOT) de[/email] (Torsten Hensel) writes:

Quote:
Da fehlen

#include #include
ok... allerdings geht es auch ohne. War das nicht die Sache, die für
den nächsten Standard beantragt ist? iostream ohne istream macht ja
wenig Sinn.

Warum denn? Wenn ich nur ausgeben will, aber nicht einlesen ...


Quote:
int main()
{
// write file
std::ofstream outFile("filename", std::ios::out | std::ios::trunc);

Hier habe ich natürlich eine Abfrage if (!outFile.is_open()) ...

Ist auf meinem Newsreader aber nicht so angekommen :-)


Quote:
outFile << std::hex << std::setfill('0') << std::setw(Cool
86767492;

Hier habe ich nun if (outFile.bad() || outFile.fail()) ... eingefügt.
Im if Zweig gebe ich eine Fehlermeldung aus, setze outFile.clear() und
schliesse dann den Stream - ok so?

fail() alleine würde wohl genügen; und clear() ist überflüssig. Ich würde
den Test so schreiben:

if (outFile << std::hex << std::setfill('0') << std::setw(Cool
<< 86767492)
; // Erfolg
else
; // Fehlermeldung


Quote:
outFile.close();

Was macht man da? Was kann dabei denn überhaupt schief gehen?

Der typische Fall ist, dass das aktuelle Verzeichnis auf einem Filesystem
liegt, auf welches übers Netz zugegriffen wird. Da kann close() schon
schief gehen; wenn ja, weisst Du nicht, was effektiv auf der Platte steht.


Quote:
Nein, es wurde dadurch behoben! Danke für den Hinweis... bisher sind
meine Dateizugriffe immer gut gegangen Wink

Dann hast Du Pech gehabt.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.