Anzeige:
Seite 2 von 2 ErsteErste 12
Ergebnis 16 bis 24 von 24

Thema: C/C++ : Stream "Intelligent Parsen"

  1. #16
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486
    Original geschrieben von anda_skoa
    Die benutzen generierte Lexer und Parser.
    Oder schreiben einen kompletten Parser per Hand from Scratch
    Siehe http://gcc.gnu.org/gcc-3.4/changes.html.
    A hand-written recursive-descent C++ parser has replaced the YACC-derived C++ parser from previous GCC releases. The new parser contains much improved infrastructure needed for better parsing of C++ source codes, handling of extensions, and clean separation (where possible) between proper semantics analysis and parsing. The new parser fixes many bugs that were found in the old parser.

  2. #17
    Registrierter Benutzer Avatar von DanDanger
    Registriert seit
    15.12.2001
    Ort
    /home/dandanger
    Beiträge
    130

    Grrrr

    Hallo,

    Mit Eurer Hilfe habe ich's geschaft, meine Text-Parsing Funktion zu schreiben :-)
    Nun, strings der Form "Text1 23 45#" kann ich nun Parsen.

    Leider Bekommt meine Text-Parsen Funktion Ihre string-Texte nun übers Netzwerk (BSD-Socket's), und da kommen dann solche Sachen an:

    "Text1 23 45#Text2 19 23#"

    Damit meine Text-Parsing Funktion des vorherigen Posts greift, müsste ich also den String in seine beiden "Teilstrings" (durch '#' getrennt) zerlegen,
    also aus : "Text1 23 45#Text2 19 23#"
    -> "Text1 23 45#"
    -> "Text2 19 23#"
    machen.

    Meine Frage : Wie geht das ??
    Ich habe schon so ziemlich alle Varianten von scanf(), cin.ignore(), etc. Ausprobiert,
    aber ohne Erfolg.

    PS : Ich habe ausser dem String auch noch die Anzahl der enthaltenen Zeichen (von den Socket's).

    PPS: Kann mir jemand ein gutes Buch zu der STL (besonders den String-Manipulations-Routienen empfehlen) ??

    Neugierige Grüsse
    DanDanger
    ------------------------------------
    DanDanger

  3. #18
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486

    Re: Grrrr

    Original geschrieben von DanDanger
    ...und da kommen dann solche Sachen an:

    "Text1 23 45#Text2 19 23#"

    Damit meine Text-Parsing Funktion des vorherigen Posts greift, müsste ich also den String in seine beiden "Teilstrings" (durch '#' getrennt) zerlegen,
    Das mußt du nicht,da die Daten in einer geordneten Reihenfolge kommen.
    Für Daten der Form n-mal "Text 23 213#",kannst du einfach so parsen
    Code:
    #include <vector>
    #include <iostream>
    #include <string>
    #include <sstream>
    
    using namespace std;
    
    struct Data
    {
    	string text;
    	int zahl1,zahl2;
    };
    
    int main()
    {
    	string Text = "Text1 23 45#Text2 19 23#Text3 23 34#";
    
    	stringstream stream(Text);
    
    	char c;
    	typedef vector<Data> DVEC;
    	typedef DVEC::const_iterator DVECITER;
    	DVEC vec;
    
    	while(!stream.fail())
    	{
    		Data temp;
    		stream >> temp.text >> temp.zahl1 >> temp.zahl2 >> c;
    		if(!stream.fail())
    			vec.push_back(temp); 
    	}
    
    	for(DVECITER i = vec.begin();i != vec.end();++i)
    		cout << i->text << " " << i->zahl1 << " " << i->zahl2 << endl;
    }
    Aber du kannst den String auch zerlegen
    Code:
    #include <string>
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
    	string Text = "Text1 23 45#Text2 19 23#";
    	
    	string::size_type pos = Text.find_first_of('#'); 
    	string text1 = Text.substr(0,pos + 1);
    	string text2 = Text.substr(pos + 1,string::npos);
    
    	cout << text1 << endl << text2 << endl;
    }
    Geändert von wraith (30-06-2003 um 09:30 Uhr)

  4. #19
    Registrierter Benutzer
    Registriert seit
    15.12.2002
    Beiträge
    25
    Die ganze Typumwandlung in gcc 2.96 funktioniert nicht mit stringstreams!!!
    Voll der scheiß

  5. #20
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486
    Original geschrieben von SourceKoT
    Die ganze Typumwandlung in gcc 2.96 funktioniert nicht mit stringstreams!!!
    Voll der scheiß
    Ja,da war doch was .
    Da mußt du mit strstream arbeiten (im Header strstream.h),ist etwas unbequemer,aber besser als die C Funktionen.

  6. #21
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Original geschrieben von SourceKoT
    Die ganze Typumwandlung in gcc 2.96 funktioniert nicht mit stringstreams!!!
    Voll der scheiß
    Kann ich nicht bestätigen.

    Hab das hier mit einem g++2.96 auf RH7.3 ausprobiert
    Code:
    #include <iostream>
    #include <sstream>
    #include <string>
    
    using namespace std;
    
    int main()
    {
            int x,y,z;
    
            stringstream istr("34 88 -144");
    
            istr >> x >> y >> z;
            cout << x << " " << y << " " << z << endl;
    
            return 0;
    }
    Funktioniert einwandfrei.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  7. #22
    Registrierter Benutzer
    Registriert seit
    26.12.2001
    Beiträge
    228
    RedHat benutzt auch einen gepachten gcc.


    Steve
    pornstars-online.de

  8. #23
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Original geschrieben von Badsteve
    RedHat benutzt auch einen gepachten gcc.
    ja, darum heißt er auch 2.96

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  9. #24
    Registrierter Benutzer
    Registriert seit
    26.12.2001
    Beiträge
    228
    Original geschrieben von anda_skoa
    ja, darum heißt er auch 2.96

    Ciao,
    _
    stimmt ja.
    sch****

    Steve
    pornstars-online.de

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •