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 schreibenGeht 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 ersetzenbringt 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 stringpumuckl 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.