¿Cómo puedo descubrir / controlar el nivel de almacenamiento en búfer interno en un fstream C ++?

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

  •  20-08-2019
  •  | 
  •  

Pregunta

Digamos que hago esto (un ejemplo artificial):

#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;
    }
}

Supongo (espero) que la biblioteca iostream haga un búfer interno aquí y no convierta esto en miles de millones de operaciones de lectura de archivos de un byte a nivel del sistema operativo.

¿Hay alguna forma de:

a) ¿Conocer el tamaño del búfer interno de ifstream?

b) ¿Cambiar el tamaño del búfer interno de ifstream?

Estoy escribiendo un filtro de archivos que necesita leer archivos de varios gigabytes en pequeños fragmentos y me gustaría experimentar con diferentes tamaños de búfer para ver si afecta el rendimiento.

¿Fue útil?

Solución

Puede usar ios::rdbuf() para obtener un puntero a un objeto streambuf. Este objeto representa el búfer interno para la secuencia.

Puede llamar a streambuf::pubsetbuf(char * s, streamsize n) para establecer un nuevo búfer interno con un tamaño determinado.

Consulte este enlace para obtener más detalles.

editar: Así es como se vería en su caso:


#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;
    }
}

editar: como lo señala litb , el comportamiento real de streambuf::pubsetbuf es " definición de implementación " ;.

Si realmente quieres jugar con los buffers, es posible que tengas que rodar tu propia clase de buffer que hereda de <=>.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top