Pergunta

Say I fazer isso (a exemplo 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;
    }
}

Eu assumo (esperança) de que a biblioteca iostream faz algum buffer interno aqui e não transformar isso em zilhões de operações de leitura de arquivo de um byte no nível OS.

Existe uma maneira de:

a) descobrir o tamanho do buffer interno de ifstream?

b) A alteração do tamanho da memória intermédia interna do ifstream?

Eu estou escrevendo um filtro de arquivo que precisa ler arquivos multi-gigabyte em pequenos pedaços e eu gostaria de experimentar com diferentes tamanhos de buffer para ver se ele afeta o desempenho.

Foi útil?

Solução

Você pode usar ios::rdbuf() para obter um ponteiro para um objeto streambuf. Este objectivo representa o tampão interno para o fluxo.

Você pode chamar streambuf::pubsetbuf(char * s, streamsize n) para definir um novo buffer interno com um determinado tamanho.

este link para mais detalhes.

Editar: Aqui está como ficaria no seu 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 apontado por litb , o comportamento real do streambuf::pubsetbuf é "implementação -definida".

Se você realmente quer brincar com os buffers, você pode ter que rolar sua própria classe buffer que herda de streambuf.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top