Von bstimmter Position aus einer Datei lesen.



  • Also,

    stream.ignore(std::numeric_limitsstd::streamsize::max(), '\n');

    bedeutet, dass ich entweder bis zum nächsten Zeilenumbruch oder std::numeric_limitsstd::streamsize::max()-viele Zeichen einlese (und ignoriere).

    std::numeric_limits<int>::max() stellt zum Beispiel die größte Zahl dar, die ein int sein kann.
    Es ist eine template-Klasse aus dem limits-Header für Standard-größenordnungen für Integrale.
    std::streamsize ist ein typedef für vielleicht unsigned int; braucht dich eben hier nicht zu kümmern.

    std::istream ist eine (abstrakte?) Basisklasse für stringstreams, filestreams, usw. Damit kann man dann bei der Funktion jede dieser abgeleiteten Klassen übergeben, die relevanten Funktionen sind ja bereits in der Basisklasse deklariert (und definiert). Referenzen solltest du kennen, sonst google sie einfach.

    Edit:

    Vergiss nicht, dass ich die Funktion editiert habe! Da fehlt bei der von dir zitierten die erste Zeile.

    istream& jump_to(istream& stream, size_t zeile, size_t zeichen )
    {
        stream.seekg(0, std::ios::beg);///<<---
        for(size_t a(0);a < zeile - 1;++a)
            stream.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        stream.ignore(zeichen);
        return stream;
    }
    


  • Ausserdem würde ich const size_t& , const size_t und int jeweils durch size_t ersetzen.



  • Nexus schrieb:

    Ausserdem würde ich const size_t& , const size_t und int jeweils durch size_t ersetzen.

    Thx, ist editiert.



  • Ok ich hab mir das ganze jetzt in der Referenz durchgelesen.Ich hab alles so weit verstanden, doch bleibt mir nun noch die Frage offen, was static_cast bedeutet.



  • 3778436F7265 schrieb:

    Ok ich hab mir das ganze jetzt in der Referenz durchgelesen.Ich hab alles so weit verstanden, doch bleibt mir nun noch die Frage offen, was static_cast bedeutet.

    Explizit statisch casten.

    typedef float Typ;
    int Objekt;
    float b(static_cast<Typ>(Objekt));
    

    Hier könnte natürlich auch implizit gecastet werden (ist ja nur z.B.). Wenn du von Basisklassen nach Kindklassen-Zeigern konvertieren willst, nimm z.B. dynamic_cast, und wenn du einen Zeiger konvertieren willst, reinterpret_cast. const_cast ist für das konvertieren von z.B. char-pointern von const char* zu char* und vice versa.



  • Hacker schrieb:

    Hier könnte natürlich auch implizit gecastet werden (ist ja nur z.B.). Wenn du von Basisklassen nach Kindklassen-Zeigern konvertieren willst, nimm z.B. dynamic_cast

    Oder nicht. Je nach dem.

    Hacker schrieb:

    , und wenn du einen Zeiger konvertieren willst, reinterpret_cast.

    Oder nicht. Eigentlich so selten wie möglich.

    Hacker schrieb:

    const_cast ist für das konvertieren von z.B. char-pointern von const char* zu char* und vice versa.

    Und andere.

    Ghostwriter von Jürgen Wolf, was?



  • Ok also soweit ich das verstanden habe ist static_cast eine convertirung, wie bei deinem Bsp. wo du dann float und int miteinander verrechnen könntest.Ist das so richtig ?



  • volkard schrieb:

    Hacker schrieb:

    Hier könnte natürlich auch implizit gecastet werden (ist ja nur z.B.). Wenn du von Basisklassen nach Kindklassen-Zeigern konvertieren willst, nimm z.B. dynamic_cast

    Oder nicht. Je nach dem.

    Genau.
    Weißt du, was z.B. heißt?

    volkard schrieb:

    Hacker schrieb:

    , und wenn du einen Zeiger konvertieren willst, reinterpret_cast.

    Oder nicht. Eigentlich so selten wie möglich.

    Gut, was dann? C-Casts? *HUST* kotz *HUST*

    volkard schrieb:

    Hacker schrieb:

    const_cast ist für das konvertieren von z.B. char-pointern von const char* zu char* und vice versa.

    Und andere.

    Siehe 1. z.B. heißt: "zum Beispiel".

    volkard schrieb:

    Ghostwriter von Jürgen Wolf, was?

    Nein.
    🕶

    Edit: Ich beginne, Mitgefühl mit PI zu haben.



  • 3778436F7265 schrieb:

    Ok also soweit ich das verstanden habe ist static_cast eine convertirung, wie bei deinem Bsp. wo du dann float und int miteinander verrechnen könntest.Ist das so richtig ?

    Deine Rechtschreibung nicht, die Aussage: jain. Verrechnen?
    Du kannst damit auch Basisklassenpointer zu Pointern von abgeleiteten Klassen machen. Oder enums zu ints konvertieren (afaik nicht bei der neuen C++11 Syntax: enum class {...}).



  • Hacker schrieb:

    Wenn du von Basisklassen nach Kindklassen-Zeigern konvertieren willst, nimm z.B. dynamic_cast

    Dafür hat mir static_cast bisher fast immer gereicht.

    Hacker schrieb:

    const_cast ist für das konvertieren von z.B. char-pointern von const char* zu char* und vice versa.

    const_cast ist für das hinzu- und wegcasten eines CV-Qualifiers. Also const/volatile.



  • 314159265358979 schrieb:

    const_cast ist für das hinzu- und wegcasten eines CV-Qualifiers.

    ...bei Zeigern und Referenzen.



  • Hacker schrieb:

    Wenn du von Basisklassen nach Kindklassen-Zeigern konvertieren willst, nimm z.B. dynamic_cast, und wenn du einen Zeiger konvertieren willst, reinterpret_cast. const_cast ist für das konvertieren von z.B. char-pointern von const char* zu char* und vice versa.

    Das widerspricht sich ein bißchen, da die Fälle sich ja überlappen.



  • Hacker schrieb:

    und wenn du einen Zeiger konvertieren willst,

    dann machst du was falsch.



  • Ja, damit man Basisklassen- zu Kindklassenpointern mit dynamic_cast konvertieren kann, muss die Basisklasse natürlich mindestens eine Virtuelle Methode haben.

    @krümelkacker & otze:

    reinterpret_cast ist nützlich, wenn Etwas bitweise interpretiert werden soll. So etwas zum Beispiel ist nur mit diesem Cast-Operator möglich:

    int b;
        long speicherwert(reinterpret_cast<long>(&b));
    

    Und was zu dynamic_cast und static_cast beachten ist: dynamic_cast prüft vor der Konvertierung, ob der Zieltyp des Basisklassenzeigers auch der ist, auf den dieser Zeigt. Sonst wird ein Null-zeiger zurückgegeben. Das ist sinnvoll, da es sicherer ist (da Klasse B anders als C ist, wie man sich denken kann).

    #include <iostream>
    
    struct A{ virtual ~A(){} }; // durch den virtuellen Destruktor polymorph
    struct B: public A{};       // von A abgeleitet
    struct C: public A{};       // von A abgeleitet
    
    int main()
    {
        A* c(new C);
    
        std::cout <<  dynamic_cast<B*>(c) << '\n';//0
        std::cout <<  static_cast<B*>(c) << '\n';//0x...
    }
    

    Dieses Programm würde ich lieber nicht ausführen:

    #include <iostream>
    
    struct A
    {
        virtual ~A(){} // durch den virtuellen Destruktor polymorph
    };
    
    struct B: public A
    {
        std::string h;
        int b;
    };
    
    struct C: public A
    {
        int c;
    };
    
    int main()
    {
        A* c(new C);
        B* gefaehrlich(static_cast<B*>(c));
        gefaehrlich->b = 0;
        std::cout << gefaehrlich->h << '\n';
    }
    

    Mit dynamic_cast wäre das nicht passiert. Abgestürzt wär's wahrscheinlich trotzdem, aber man kann auf Null-Rückgabe prüfen.



  • Hacker schrieb:

    reinterpret_cast ist nützlich, wenn Etwas bitweise interpretiert werden soll. So etwas zum Beispiel ist nur mit diesem Cast-Operator möglich:

    int b;
        long speicherwert(reinterpret_cast<long>(&b));
    

    Das ist nun das mit Abstand schlechteste Beispiel, das du bringen konntest. Die Addresse interessiert nun wirklich keine Sau. Du hättest z.B. zeigen können, wie man Werte binär in einen Stream schreibt.

    Hacker schrieb:

    Das ist sinnvoll, da es sicherer ist.

    So 'n Quatsch. Das sind zwei verschiedene Dinge.

    Hacker schrieb:

    Mit dynamic_cast wäre das nicht passiert. Abgestürzt wär's wahrscheinlich trotzdem, aber man kann auf Null-Rückgabe prüfen.

    Nenn doch deine Klassen z.B. Base, Derived1 und Derived2, dann tut man sich beim lesen des Codes leichter.



  • 314159265358979 schrieb:

    Hacker schrieb:

    reinterpret_cast ist nützlich, wenn Etwas bitweise interpretiert werden soll. So etwas zum Beispiel ist nur mit diesem Cast-Operator möglich:

    int b;
        long speicherwert(reinterpret_cast<long>(&b));
    

    Das ist nun das mit Abstand schlechteste Beispiel, das du bringen konntest. Die Addresse interessiert nun wirklich keine Sau.

    Findest du, weil du eine Sau bist. Einen Menschen interessierts 😉

    PI schrieb:

    Hacker schrieb:

    Das ist sinnvoll, da es sicherer ist.

    So 'n Quatsch. Das sind zwei verschiedene Dinge.

    Das widerspricht sich nicht einmal, und außerdem: Zeig mir in diesem Zusammenhang mal, wie static_cast besser/gleich gut funktioniert, als dynamic_cast

    Hacker schrieb:

    Mit dynamic_cast wäre das nicht passiert. Abgestürzt wär's wahrscheinlich trotzdem, aber man kann auf Null-Rückgabe prüfen.

    Nenn doch deine Klassen z.B. Base, Derived1 und Derived2, dann tut man sich beim lesen des Codes leichter.[/quote]

    Lesen wird (da!) groß Geschrieben.
    Und außerdem hat das damit nichts zu tun. Es geht darum, dass man bei dynamic_cast prüfen kann, ob der Cast funktioniert hat, bzw. "nicht noch ins Verderben führen wird" (wie soll ich dass denn ausdrücken 😃 ).



  • Hacker schrieb:

    Findest du, weil du eine Sau bist. Einen Menschen interessierts 😉

    Du weißt nicht, wann Schluss ist, kleiner Mann.

    Hacker schrieb:

    Das widerspricht sich nicht einmal

    Was widerspricht sich nicht?

    Hacker schrieb:

    Zeig mir in diesem Zusammenhang mal, wie static_cast besser/gleich gut funktioniert, als dynamic_cast

    Ich hab doch schon gesagt, dass das zwei verschiedene Dinge sind. Was willst du von mir?

    Hacker schrieb:

    Lesen wird (da!) groß Geschrieben.

    Fang mal nicht mit Rehctshcriebfalems an, du kannst nur verlieren.

    Hacker schrieb:

    Und außerdem hat das damit nichts zu tun. Es geht darum, dass man bei dynamic_cast prüfen kann, ob der Cast funktioniert hat, bzw. "nicht noch ins Verderben führen wird" (wie soll ich dass denn ausdrücken 😃 ).

    Ich sags dir auch gerne ein drittes mal: Das sind zwei verschiedene Dinge.



  • Moment mal. Thorsten Dörnbach?

    314159265358979 schrieb:

    Hacker schrieb:

    Das ist sinnvoll, da es sicherer ist.

    So 'n Quatsch. Das sind zwei verschiedene Dinge.

    Also,

    314159265358979 schrieb:

    Hacker schrieb:

    Das widerspricht sich nicht einmal

    Was widerspricht sich nicht?

    Das es zwei verschiedene Dinge sind, und dass das eine sicherer ist, wenn es um etwas konkretes geht (!). Haste wohl missverstanden.

    Und was sind zwei verschiedene Dinge? Ich hoffe, dynamic_cast und static_cast?



  • Hacker schrieb:

    Moment mal. Thorsten Dörnbach?

    wat?

    Hacker schrieb:

    Und was sind zwei verschiedene Dinge? Ich hoffe, dynamic_cast und static_cast?

    Rüchtüch. Und deswegen ist das eine auch nicht sicherer, als das andere. Es sind zwei verschiedene Dinge.



  • 314159265358979 schrieb:

    Und deswegen ist das eine auch nicht sicherer, als das andere. Es sind zwei verschiedene Dinge.

    Ich meinte es nicht so allgemein wie du denkst. Es bezog sich auf's konvertieren von Basisklassen- zu Kindzeigern.

    Zu Thorsten Dörnbach: hier ist ein lustiges Video.
    Du erinnerst mich (aus fraglichem Grund) an den.


Anmelden zum Antworten