Ich war vor einem Jahrzehnt C++ - Experte, aber seit 10 Jahren programmiere ich Java. Ich habe gerade ein C++ - Projekt gestartet, das einen kleinen XML-Parser von Drittanbietern verwendet. Der XML-Parser akzeptiert einen STL iStream. Meine XML-Daten stammen von einem Windows-COM-IStream. Ich dachte, ich würde das Richtige tun und einen Adapter erstellen, um die IStream-Daten zu übernehmen und sie dem XML-Parser über einen iStream zu präsentieren.Wie implementiere ich seekg() für einen benutzerdefinierten istream/streambuf?
Ich folgte dem ausgezeichneten Tutorial um http://www.mr-edd.co.uk/blog/beginners_guide_streambuf und erstellt einen COMStreambuf, der Daten aus dem zugrunde liegenden COM IStream verwendet und es als Puffer für einen benutzerdefinierten COMIstream verwendet. Alles sieht gut aus, aber ich bekomme einen Lesefehler vom Parser.
Es stellt sich heraus, dass der Parser die gesamte Datei in den Speicher liest, indem er seekg() auf dem istream verwendet, um seine Größe herauszufinden, und dann mit seekg() zum Anfang zurückgeht, um es auf einmal zu lesen. Es überrascht nicht, dass das oben erwähnte Tutorial entschieden hat, "Anweisungen für die Implementierung eines Suchauftrags zu speichern", die anscheinend nie geschrieben wurden.
Kann mir jemand sagen, was ich tun muss, um seekg() mit meiner benutzerdefinierten istream/streambuf zu implementieren? Ich würde es selbst wagen (meine erste Neigung wäre, Dinge in istream zu überschreiben), aber mit meiner Unerfahrenheit so tief in der STL und mit meiner Java-Mentalität fürchte ich, ich würde etwas Unvollständiges tun und eine brüchige Lösung haben. (Ohne Tutorials zum Beispiel hätte ich nie gedacht, dass man einen benutzerdefinierten istream erstellt, indem man beispielsweise einen neuen streambuf schreibt oder ich imbue() mit einem Standardgebietsschema usw. aufrufen müsste)
Danke für jede Hilfe. Ich war sehr beeindruckt von dieser Seite - sowohl mit dem Wissen der Teilnehmer als auch mit ihrer freundlichen, ehrlichen Art, zuzugeben, wer die beste Antwort hat. :)
Was ist 'gback()'? Meintest du "eback()"? – 0x499602D2
@ 0x499602D2: Ja. Danke, dass Sie das bemerkt haben. –