Suchen in Text aus datei



  • hallo ihr,

    meine frage, ich habe eine datei mit daten, diese lese ich ein!
    nun möchte ich aber nur spezielle daten anzeigen!

    meine idee ist alles in einen string zu laden, und in dem string nach dem suchwort suchen, und bis zu einem von mir festgelegten zeichen alles ausgeben!

    nun weiß ich nicht ob das eine gute idee ist, oder ob ich mit stringstreams arbeiten sollte?damit habe ich aber nicht so die erfahrung!

    bis jetzt habe ich es so:

    void LoadFromFileB(ifstream& str)
    {
     string buffer;
     while(!str.eof())
     {
      str>>buffer;
      cout<<buffer<<endl;
     }
    }
    

    dateiinhalt sieht ungefähr so aus:

    -----------------Buch1--------------------
    ISBN:1234567890
    Titel:Buch1
    Autor:Schneider
    Preis:12.34€
    Seitenanzahl:222
    Methode:Gelocht
    
    -----------------Buch2--------------------
    ISBN:1234567890
    Titel:Buch2
    Autor:Ss
    Preis:34.546€
    Seitenanzahl:12
    Methode:Geklebt
    

    nun möchte ich nur die daten von Buch1 anzeigen...!



  • da hier eh keiner antwortet kann ich ja was weniger konstruktives schreiben...

    Musst du das ganze mit C++ lösen oder wäre dir auch ne andere Lösung recht? mit Php geht sowas zum Beispielt total easy. in C++ ist die Verarbeitung von Strings im direkten Vergleich (zu PHP) nen Krampf.

    Ansonsten würde ich da ich auch keine Ahnung von streams habe. Zeile für Zeile einlesen und nach "-Buchname-" suchen. bei einem Treffer dann eine funktion starten die die nächsten 6 Zeilen (for()) ausgibt.



  • @Streams:
    Schreibe dir eine Klasse book, die op>> überlädt.

    Beispiel:

    struct book
    {
        map<string, string> data() const { return m_values; }
    
        istream& operator>>(istream& is, book& rhs)
        {
            rhs = book(); // einlesen entspricht einer "Neukonstruktion".
            string line;
            while(getline(is, line) && line != "") // Abruch mit leerer Zeile...
                rhs.process_line(line);
    
            return is;
        }
    
        // weitere Funktionalität sei Dir als Übung überlassen ;-)
        // ...
    
        private:
            map<string, string> m_values;
    
            void process_line(const string& rhs)
            {
                string::size_type pos = rhs.find(":");
                if(pos != string::npos)
                    m_values.insert( pair<string, string>(rhs.substr(0, pos), rhs.substr(pos + 1)) );
                else
                    throw exception() // Fehlerbehandlung. Am besten durch eine eigens konzipierte Klasse z.B. invalid_book() o.ä. verbessern...
            }
    };
    

    Mithilfe dieser Klasse kannst du problemlos einzelne Zeilen ausgeben, z.B. den Titel des Buches, etc. ...

    Beispiel:

    #include <iostream>
    #include <algorithm>
    #include <iterator>
    using namespace std;
    
    int main()
    {   
        ifstream in("book_data.txt", ios::binary);
        if(in)
        {
            vector<book> books;
            copy(istream_iterator<book>(in), istream_iterator<book>(), back_inserter(books));
    
            // von jedem Buch den Titel ausgeben, sofern dieser gesetzt ist:
            for(vector<book>::const_iterator it = books.begin(); it != books.end(); ++it)
            {
                if(it->data().count("Titel"))
                    cout << "Titel von Buch " << it - books.begin() << ": " << (*it)["Titel"] << endl;
    
            }
        }
        else
            // Fehler beim öffnen der Datei.
    }
    

    Du siehst: Mithilfe der STL und der Klasse std::string lässt sich das Einlesen auch unter C++ sehr einfach gestalten :).

    Gruß Caipi



  • danke schonmal!

    ABER ich bin noch nciht bei der STL...also könntest mir das auch ohne diese container mal erklären? 😞



  • und vielleicht kannst du mir auch mal ein beispiel für eine (einfache) eigene exception-klasse mit verwendung geben?
    Hab sowas noch nciht gemacht...und weiß nicht,wie ich da ran gehen könnte/sollte



  • Streams... schrieb:

    ABER ich bin noch nciht bei der STL...also könntest mir das auch ohne diese container mal erklären? 😞

    Die STL gehört normalerweise zum "Lieferumfang" von C++ dazu - und so schwer anzuwenden ist sie auch nicht.
    (ich empfehle die Lektüre vom www.cppreference.com als Einstieg)

    @Caipi: Erstens müsste der operator>> eine gloable Funktion sein (oder Member von istream, aber da kommt der Normaluser nicht ran) und zweitens würde ich bei einem Fehler keine Expection werfen, sondern den einlesenden Strream in einen Fehlerstatus setzen.

    und vielleicht kannst du mir auch mal ein beispiel für eine (einfache) eigene exception-klasse mit verwendung geben?

    Wenn du schon mit der STL Probleme hast, würde ich noch nicht mit Exception-Behandlung anfangen.



  • ich habe damit keine probleme, habe mir nur die ganzen container noch nicht angeschaut!

    Möchte eben lieber erstmal selber solche klassen "nachbauen"

    Darum wäre eine eigene exceptionklasse sicher nicht verkehrt, oder?



  • @Caipi: Erstens müsste der operator>> eine gloable Funktion sein (oder Member von istream, aber da kommt der Normaluser nicht ran)

    Jup. Hast recht. Habe wohl zuviel an das Schlüsselwort friend gedacht... 😉

    und zweitens würde ich bei einem Fehler keine Expection werfen, sondern den einlesenden Strream in einen Fehlerstatus setzen.

    Das ist imho Ansichtssache... (Ist aber wahrscheinlich doch eleganter :))

    Gruß Caipi


Anmelden zum Antworten