Wie aus basic_ifstream lesen?
-
Hi,
wie kann ich aus einem basic_ifstream<CharT> mit CharT als beliebigen character type einen CharT auslesen?
-
mit get, wie gehabt?
-
bist du der echte Michael E.??
-
Bashar: Was macht man, wenn sizeof(CharT) größer ist als sizeof(int)? [EDIT] istream& get (char& c ); benutzen.
Außerdem will get() bei mir nicht so richtig:
#include <fstream> #include <iostream> template < typename CharT > class Huffman { public: typedef CharT char_type; explicit Huffman(const char *fileName) { std::basic_ifstream<CharT> in(fileName); while(in) { CharT buffer; buffer = static_cast<CharT>(in.get()); data_.push_back(buffer); if((in.rdstate() & std::basic_ifstream<CharT>::badbit) != 0) std::cout << "badbit" << std::endl; if((in.rdstate() & std::basic_ifstream<CharT>::failbit) != 0) std::cout << "failbit" << std::endl; if((in.rdstate() & std::basic_ifstream<CharT>::eofbit) != 0) std::cout << "eofbit" << std::endl; if((in.rdstate() & std::basic_ifstream<CharT>::goodbit) != 0) std::cout << "goodbit" << std::endl; } // ... } // ... }; Huffman<wchar_t> h("test");Die Datei test hat denselben Inhalt wie huffman.h, fängt also mit "#ifndef MICHAEL_E_COMPRESSION_HUFFMAN_H" an. Ausgabe ist folgende:
badbit failbitDurch den Debugger habe ich erfahren, dass in.get() den Wert 65535 zurückliefert. Was läuft hier falsch?
-
Michael E. schrieb:
Bashar: Was macht man, wenn sizeof(CharT) größer ist als sizeof(int)?
Man benutzt
in.get(buffer);
-
Bei mir läuft dein code einwandfrei.
Wenn dich die Ausgabe badbit failbit stört die kommt bei eof.
Kurt
-
ZuK: Bei mir läufts leider nicht
Ich benutze Code::Blocks mit gcc 3.4.4 unter der Haube.badbit und failbit kommen bei mir schon beim ersten Schleifendurchlauf, hat also nix mit eof zu tun.
-
Wenn ich in.get(buffer) benutze, kommt beim ersten Schleifendurchlauf wieder badbit und failbit, allerdings steht dann in buffer der Wert 68 (EDIT: jetzt 61).
BTW: Die Datei "test" wurde als 8bit abgespeichert. Dann müsste der erste Wert eigentlich 9065 sein.
[EDIT] Wenn ich als Unicode/UTF-8 abspeicher, kommt dasselbe Ergebnis.
-
Habs jetzt nochmal getestet. Mit VC6 funktioniert es einwandfrei.
Mit g++ ( 3.3.3 Cygwin ) compilierts nur mit Huffman<char> h("test") und dann funktioniert es. ( wahrscheinlich fehlt mir irgend ein header )
Kurt
-
Michael E. schrieb:
Bashar: Was macht man, wenn sizeof(CharT) größer ist als sizeof(int)? [EDIT] istream& get (char& c ); benutzen.
Guck dir mal die Definition von basic_istream::get an, da gibts kein int. get hat den Rückgabewert int_type, was wiederum ein typedef auf den Member int_type des entsprechenden char_traits<charT> ist.
Wenn du ungewöhnliche Typen für charT einsetzen willst, wirst du dir eine eigene char_traits-Spezialisierung schreiben müssen.
-
Bashar: Danke für den Hinweis. Hab in der Hilfe von istream geguckt

Mein Problem besteht leider immer noch.