This answer weist darauf hin, dass C++ nicht gut für die Iteration über eine Binärdatei geeignet ist, aber das ist, was ich jetzt brauche, kurz gesagt muss ich auf Dateien "binär" arbeiten, ja alle Dateien sind binär sogar die .txt-Dateien, aber ich schreibe etwas, das mit Bilddateien arbeitet, also muss ich Dateien lesen, die gut strukturiert sind, wenn die Daten auf eine bestimmte Weise angeordnet sind.C++ - Binärdateien und Iteratoren: mit 1: 1 mit ifstreambuf_iterator wegkommen?
Ich möchte die gesamte Datei in einer Datenstruktur wie std::vector<T>
lesen, so dass ich fast sofort die Datei schließen und mit dem Inhalt im Speicher arbeiten kann, ohne sich um Datenträger I/O mehr kümmern.
Gerade jetzt, der beste Weg, eine komplette Iteration über eine Datei nach der Standardbibliothek durchzuführen ist etwas entlang der Linien von
std::ifstream ifs(filename, std::ios::binary);
for (std::istreambuf_iterator<char, std::char_traits<char> > it(ifs.rdbuf());
it != std::istreambuf_iterator<char, std::char_traits<char> >(); it++) {
// do something with *it;
}
ifs.close();
oder std::copy
verwenden, aber auch mit std::copy
sind Sie immer mit istreambuf
Iteratoren (Wenn Sie also die C++ - Dokumentation richtig verstehen, lesen Sie bei jedem Aufruf grundsätzlich 1 Byte mit dem vorherigen Code).
Die Frage ist also: Wie schreibe ich einen benutzerdefinierten Iterator? woher sollte ich erben?
Ich gehe davon aus, dass dies auch beim Schreiben einer Datei auf die Festplatte wichtig ist, und ich nehme an, dass ich die gleiche Iteratorklasse zum Schreiben verwenden könnte, wenn ich falsch liege.
Ist die * Größe * der eingehenden Daten von nur ['if.read'] (http://en.cppreference.com/w/cpp/io/basic_istream/read) ausgeschlossen, so dass die Daten direkt angezeigt werden in einen 'std :: vector' und darüber iterieren? –
WhozCraig
@WhozCraig für jetzt glaube ich nicht, dass die Datei zu groß sind, um im Speicher gehalten zu werden (wenn das ist, was Sie beziehen), bin ich gut mit 'lesen' oder einer anderen Möglichkeit, sogar der Konstruktor der 'vector' class unterstützt Iteratoren, also bin ich auf dieser Seite in Ordnung, das" Problem "sind die Iteratoren selbst, ich möchte eine schreiben, um zu versuchen, die Daten anders zu durchsuchen. EDIT: Ich möchte jeden C-ish-Weg vermeiden, ich bleibe bei den Iteratoren. – user2485710
* Sie lesen grundsätzlich 1 Byte bei jedem Aufruf * - aus 'ifstream's Speicherpuffer, nicht aus der Datei selbst. Die tatsächlichen Lese (2) -Aufrufe sind immer noch für alle 4k oder 16k oder was auch immer der Standardpuffer für Sie ist. – Cubbi