Ich habe Code, der ifstream
verwendet, um Daten aus einer Datei zu lesen, und alles funktioniert.
Jetzt möchte ich, ohne etwas Code zu ändern, diese Daten aus einem Speicher lesen, tatsächlich habe ich ein char *
, das die Daten enthält ...
Wie kann ich meine char *
-Daten in ein ifstream
einfügen, ohne die Datei effektiv zu lesen?
Wenn der Code, der ifstream&
verwendet, leicht geändert werden kann, um istream&
zu verwenden, können Sie problemlos zwischen ifstream
und istringstream
(zum Lesen von Daten aus dem Speicher):
Anrufer:
%Vor% Die Standardbibliothek bietet einen speicherinternen istream
, der auch beschreibbar ist: std::stringstream
.
Sie müssen Ihren Code richtig abstrahieren, damit er ein generisches istream
anstelle eines ifstream
akzeptiert, ein stringstream
erstellt, es mit Ihren Daten füllt und dieses an die Funktion übergibt.
Zum Beispiel:
%Vor% Obwohl die Verwendung von std::istringstream
(manchmal fälschlicherweise mit dem führenden i
bezeichnet; eine solche Klasse existiert auch, ist aber teurer zu konstruieren, da sie auch einen Ausgabestrom einrichtet) ist sehr populär, denke ich Es lohnt sich, darauf hinzuweisen, dass dies mindestens eine Kopie der tatsächlichen Zeichenfolge ergibt (ich vermute, dass die meisten Implementierungen sogar zwei Kopien erstellen). Das Erstellen beliebiger Kopien kann mit einem trivialen Stream-Puffer vermieden werden:
Bei einem kleinen Speicherbereich spielt der Unterschied keine Rolle, obwohl die gespeicherte Zuordnung auch dort erkennbar sein kann. Für große Teile des Gedächtnisses macht es einen großen Unterschied.
In meinem Projekt verwende ich die write () und read () Methoden von iostream, da ich binäre Daten in einen Stringstream schreibe. Entschuldigung, der folgende Code wurde nicht getestet und hat wahrscheinlich Syntaxfehler (tippen von Office ... ;-), aber so etwas erlaubt es dir, in Speicher, Dateien und anderswo zu schreiben (z. B. Netzwerk-Sockets):
%Vor%