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
    failbit
    

    Durch 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.


Anmelden zum Antworten