File auslesen (letztes Zeichen)



  • Hallo @ all,
    ich habe folgendes Problem:

    http://www.ubuntuusers.de/paste/737/ hier erstmal der Code 🙂 <--

    Ich möchte zuerst die letzte Zeile der Datei auslesen, jedoch bekomme ich entweder mit (fileReadBuch.open("buch.txt", ios::in);) alles oder mit fileReadBuch.open("buch.txt", ios::in|ios::ate);) gar nichts.

    Mein Ziel ist es nur die Letzte Zeile als Zahl am besten int zu erhalten.

    Wäre nice wenn ihr mir eine kurze Hilfe geben könnt.

    Gruss Michael



  • Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum C++/CLI mit .NET in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Folgende Verbesserungsvorschläge.
    1.) Benutze std::string statt char*
    2.) Packe das Buch in eine Klasse
    3.) Schreibe Streaming-Operatoren für das Buch

    wenn Du diese Hürden genommen hast, kannst Du Dir überlegen, wie man die ID des zuletzt geschriebenen Buches bekommt. Der sicherste Weg ist wohl, alle Bücher aus dem File zu lesen und damit auch die Id des letzten Buches. In Code sähe das dann so aus:

    #include <iostream>
    #include <fstream>
    #include <string>   // std::string; getline
    
    class Buch
    {
    public:
        Buch()
            : m_erscheinungsjahr( 0 )
        {}
    
        Buch( const std::string& Name, const std::string& ISBN, const std::string& Autor, const std::string& Verlag, 
            int Erschjahr, const std::string& AusgeliehenVon )
            : m_titel( Name )
            , m_isbn( ISBN )
            , m_autor( Autor )
            , m_verlag( Verlag )
            , m_erscheinungsjahr( Erschjahr )
            , m_ausleiher( AusgeliehenVon )
        {}
    
        // -- Buch ausgeben
        friend std::ostream& operator<<( std::ostream& out, const Buch& buch )
        {
            using std::endl;
            out << "\n"<< buch.m_titel <<endl;
            out << buch.m_isbn << endl;
            out << buch.m_autor << endl;
            out << buch.m_verlag << endl;
            out << buch.m_erscheinungsjahr << endl;
            out << buch.m_ausleiher << endl;
            return out;
        }
        // -- Buch einlesen
        friend std::istream& operator>>( std::istream& in, Buch& buch )
        {
            using std::endl;
            in >> std::ws; // Leerzeile überlesen
            getline( in, buch.m_titel );
            getline( in, buch.m_isbn );
            getline( in, buch.m_autor );
            getline( in, buch.m_verlag );
            in >> buch.m_erscheinungsjahr >> std::ws;
            getline( in, buch.m_ausleiher );
            return in;
        }
    
    private:
        std::string m_titel;
        std::string m_isbn;
        std::string m_autor;
        std::string m_verlag;
        int m_erscheinungsjahr;
        std::string m_ausleiher;
    };
    
    int addBuch( const Buch& neuesBuch ) 
    {
        using namespace std;
        int id = -1; // keine Id
        {
            ifstream fileReadBuch( "buch.txt" );
            for( Buch buch; fileReadBuch >> buch >> id; )
                ;
        } // schließt das File
        if( id < 0 )
            id = 0;
    
        ofstream fileBuch( "buch.txt", ios::app );
        fileBuch << neuesBuch << id + 1 << endl;  // Buch unter der nächsten freien Id ablegen
        return 0;
    }
    
    int main()
    {
        Buch b1( "TheBlubb", "034-0827-483", "Meister", "Kein Verlag", 2001, "-" );
        addBuch( b1 ); 
    
        return 0;
    }
    

    Gruß
    Werner



  • Hallo Werner,
    nach der Aufgabe muss ich das aber mit char* machen 😞
    Wir haben in der Schule so ein Mischmasch von C/C++.

    Wir benutzen zwar Klassen jedoch keine String etc., sondern char*.

    Ich hab jetzt jedoch eine Lösung gefunden. Ich lese Jede Zeile aus, wandel diese in eine int Variable um und sichere mir diese. Das wiederhole ich und vergleich ob die Zahl gleich oder größer ist. Wenn größer speicher ich wieder diesen wert bis die Datei zuende ist. So hab ich dann den höchst eingetragenen ID Wert.

    Ist zwar nicht optimal aber ich probier das mal aus 🙂

    Ich habe jedoch noch ein Problem mit dem Löschen.
    Hier der Code: http://mandrill.fuxx0r.net/c++/paste:6279

    Das Problem dabei ist, es wird die betreffende Stelle richtig gelöscht, jedoch werden am Anfang an die Datei komische Zeichen (Ð#¿) eingefügt und am ende immer 2 leere Zeilen eingefügt.

    Könnte mir jemand sagen wesshalb? Hier die Datei: http://mandrill.fuxx0r.net/c++/paste:6280 (an der Stelle wo 1/2 Leerzeile steht ist normalerweise nichts).

    Gruss Michael


Log in to reply