ifstream faken



  • Hi,

    ich habe ein Programm welches "normalerweise" aus mehreren xml-Files Daten holt.

    --- ursprünglicher Zustand ---

    ifstream infile;
    infile.open(XML_filename.c_str());
    ...
    

    Dort wo ich das Programm laufen lassen will/muss habe ich keinen Zugriff auf das File-System wo die xml-Files sind. Ich kann aber diese "importieren" und kriege so deren Inhalt als char-Array.

    Jetzt muss ich irgendwie den ursprünglichen ifstream durch das char-Array ersetzen. Da die weitere Verarbeitung (xml-parser) der Daten recht komplex (bzw. viel Quellcode und für mich nicht interessant einzuarbeiten da eher nebensächlich) ist versuche ich "einfach" den ifstream zu ersetzen.

    Meine Versuche bisher waren:
    -- ersetze ifstream durch stringstream ---

    importfile(name, chararray);     // Schreibt den Inhalt der xml-Files ins chararray
    stringstream infile (stringstream::in | stringstream::out);     // stringstreamobj ersetllen
    infile<<chararray;     // chararray ins stringstreamobj schreiben
    

    Geht nicht, der xml-Parser sagt "no element" (k.A. wieso)
    ein "cout<<infile.str();" Schreibt den erwarteten Inhalt der xml-Files auf den Bildschirm.

    -- ersetze den streambuffer --

    importfile(name, chararray);     // Schreibt den Inhalt der xml-Files ins chararray
    stringstream instring stringstream::in | stringstream::out);
    infile<<chararray;     // chararray ins stringstreamobj schreiben
    ifstream infile;     // ifstreamobj erstellen
    infile.rdbuf(instring.rdbuf());     // streambuffer des ifstreamobj durch den des stringstreamobj ersetzen
    

    bringt den Compilererror " no matching function for call to `fstream::
    rdbuf (stringbuf *)'"

    Hat jmd ne Lösung/Hinweis für diese Problem? Geht das überhaupt wie ich mir das denke oder gibts nen anderen Weg?

    Danke schon mal, Grüße
    Markus



  • wenn du nach dem öffnen des streams nur auf das istream-Interface zugreifst, kannst du dein char-array über std::string in einen istringstream stecken und dann aus dem lesen - ist auch ein istream, genau wie der ifstream.



  • Danke pumuckl,

    es funktioniert noch nicht ganz, aber es tut sich schon mal was..

    pumuckl schrieb:

    wenn du nach dem öffnen des streams nur auf das istream-Interface zugreifst,...

    ich gehe davon aus (hoffe es), da im "originalcode" ja auch ein ifstream verwendet wird

    pumuckl schrieb:

    dein char-array über std::string

    string instring (chararray); // chararray to string
    

    pumuckl schrieb:

    in einen istringstream stecken

    istringstream infile;
    infile.str(instring);
    

    ..und dann aus dem lesen. Jetz sagt der xml-parser (welcher den stream verarbeitet) gar nix mehr (keine (Fehler)-Meldung). Ich muss mich wohl doch in den xml-parser graben 😞 , oder es gibt noch wo anders ein Problem..

    Gruss
    Markus



  • hola

    probier mal folgendes:

    std::ifstream datei;
    std::stringstream strstream; (da tust dein char-array rein)
    std::streambuf *old = datei.rdbuf();
    datei.rdbuf(strstream.rdbuf());
    
    ...
    mach deine sachen 
    ...
    
    datei.rdbuf(old);
    

    ist ungetestet.

    Meep Meep



  • Hey Meep Meep,

    das würd etwa dem entsprechen was ich anfangs als "ersetzte den streambuffer" schon mal beschrieben hab.

    Er spukt auch die gleiche Fehlermeldung

    "no matching function for call to `ifstream::rdbuf (stringbuf *)'"
    

    aus.
    Anscheinend ist der erwartete Übergabewert ein filebuf (wie zu erwarten bei filestream-obj), ich übergebe aber einen stringbuf (da ja stringstream-obj). Auch ich hätte erwartet das die buffer austauschbar sind... offensichtlich aber nicht.

    Trotzdem danke 😉

    Gruss
    Markus



  • ich sollt vllt. noch erwähnen dass dies

    datei.rdbuf(strstream.rdbuf());
    

    der springende Punkt ist.


Anmelden zum Antworten