Datei zeichenweise auslesen - newline Problem.



  • redrew99 schrieb:

    Wenn ich das richtig sehe, müßte in Zeile 8 und 15 noch ein "typename" gesetzt werden, sonst kompiliert der Code nicht.

    typename std::basic_istream< E, Traits >::sentry ok( in);
    ...
    for( typename Traits::int_type m = in.rdbuf()->sgetc(); ; m = in.rdbuf()->snextc() )
    ...
    

    Hallo redrew99,

    Natürlich habe ich den Code vorher mal durch den Compiler geschickt, aber Du hast Recht, das Visual Studio, welches ich verwende, ist da recht großzügig.

    Gruß
    Werner



  • Möchte ich nochmal festhalten: MSVC ist, was Templates angeht kaputt. Werner gibt mir Recht.

    ICH HABE RECHT!



  • 314159265358979 schrieb:

    Möchte ich nochmal festhalten: MSVC ist, was Templates angeht kaputt.

    Ja, Visual C++ hat einige Bugs im Bereich Templates. "Ist kaputt" ist aber vielleicht etwas übertrieben, obwohl das natürlich Ansichtssache ist.

    Werner gibt mir Recht.

    ICH HABE RECHT!

    Ganz ruhig, Mami kommt gleich.



  • Mami ist tot. <.<


  • Mod

    Hier mal ein Entwurf mit einem eigenen num_get-facet:

    #include <iostream>
    #include <locale>
    
    class my_num_get : public std::num_get<char>
    {
    private:
        template <typename T>
        iter_type do_do_get(iter_type in, iter_type end, std::ios_base& str, std::ios_base::iostate& err, T& v) const
        {
            bool negative = false;
            for ( ; in != end; ++in )
            {
                auto c = *in;
                if ( c == '+' )
                    negative = false;
                else if ( c == '-' )
                    negative = true;
                else
                    break;
            }
            auto res = std::num_get<char>::do_get( in, end, str, err, v );
            if ( negative )
                v = -v;
            return res;
        }
    
        virtual iter_type do_get(iter_type in, iter_type end, std::ios_base& str, std::ios_base::iostate& err, long& v) const override { return do_do_get( in, end, str, err, v ); }
        virtual iter_type do_get(iter_type in, iter_type end, std::ios_base& str, std::ios_base::iostate& err, long long& v) const override { return do_do_get( in, end, str, err, v ); }
        virtual iter_type do_get(iter_type in, iter_type end, std::ios_base& str, std::ios_base::iostate& err, unsigned short& v) const override { return do_do_get( in, end, str, err, v ); }
        virtual iter_type do_get(iter_type in, iter_type end, std::ios_base& str, std::ios_base::iostate& err, unsigned& v) const override { return do_do_get( in, end, str, err, v ); }
        virtual iter_type do_get(iter_type in, iter_type end, std::ios_base& str, std::ios_base::iostate& err, unsigned long& v) const override { return do_do_get( in, end, str, err, v ); }
        virtual iter_type do_get(iter_type in, iter_type end, std::ios_base& str, std::ios_base::iostate& err, unsigned long long& v) const override { return do_do_get( in, end, str, err, v ); }
    };
    
    int main()
    {
        using namespace std;
        cin.imbue(locale(locale(""), new my_num_get()));;
        long long wert;
        for (;;)
        {
            cin >> wert;
            if (cin.eof())
                break;
            if (cin)
                cout << wert << '\n';
            else
                {
                    cin.clear();
                    cin.ignore(1);
                }
        }
    }
    


  • Mit Makros wärs besser.


  • Mod

    314159265358979 schrieb:

    Mit Makros wärs besser.

    Das ist eine sehr subjektive Wahrheit. Dein Fetisch wird nämlich nicht allgemein geteilt.



  • Es wird:
    - Besser lesbar
    - Besser wartbar
    - Die Fehlerwahrscheinlichkeit reduziert

    Also ja, mit Makros ist es besser.



  • 314159265358979 schrieb:

    Es wird:
    - Besser lesbar
    - Besser wartbar
    - Die Fehlerwahrscheinlichkeit reduziert

    Also ja, mit Makros ist es besser.

    Nein.
    Nein.
    Nein.
    Nein.



  • Troll or just stupid?


Anmelden zum Antworten