Wie kann ich entdecken / steuern die Pegel der internen Pufferung in einem C ++ fstream?
Frage
Sagen wir, ich tun, um diese (eine erfundene Beispiel):
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char* argv[])
{
ifstream ifs(argv[1]);
char ch;
while(ifs.read(&ch, 1)) {
cout << ch;
}
}
Ich gehe davon aus (Hoffnung), dass die iostream-Bibliothek hat einige interne Pufferung hier und dreht sich nicht diese in zig Ein-Byte-Datei-Leseoperationen auf OS-Ebene.
Gibt es eine Möglichkeit von:
a) Suche nach der Größe des ifstream internen Puffers aus?
b) Ändern der Größe von ifstream internen Puffer?
Ich schreibe eine Datei-Filter, Multi-Gigabyte-Dateien in kleine Stücke zu lesen braucht und ich möchte mit verschiedenen Puffergrößen experimentieren, um zu sehen, ob es die Leistung auswirkt.
Lösung
Sie können ios::rdbuf()
verwenden, um einen Zeiger auf ein streambuf
Objekt zu erhalten. Diese Aufgabe stellt den internen Puffer für den Stream.
Sie können streambuf::pubsetbuf(char * s, streamsize n)
rufen Sie einen neuen internen Puffer mit einer bestimmten Größe zu setzen.
Siehe diesen Link für weitere Details.
bearbeiten: Hier ist, wie es in Ihrem Fall aussehen:
#include <iostream>
#include <fstream>
using namespace std;
int main(int argCount, char ** argList[])
{
ifstream inStream(argList[1]);
char myBuffer [512];
inStream.rdbuf()->pubsetbuf(myBuffer, sizeof(myBuffer));
char ch;
while(inStream.read(&ch, 1))
{
cout << ch;
}
}
bearbeiten: wie von litb weist darauf hin, , das tatsächliche Verhalten von streambuf::pubsetbuf
ist „Umsetzung -defined“.
Wenn Sie wirklich mit den Puffern spielen, um möchten, können Sie Ihre eigene Pufferung Klasse rollen, die von streambuf
erbt.