Wie kann ich entdecken / steuern die Pegel der internen Pufferung in einem C ++ fstream?

StackOverflow https://stackoverflow.com/questions/351582

  •  20-08-2019
  •  | 
  •  

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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top