Como posso descobrir / controlar o nível de buffer interno fstream um C ++?
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?
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.
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
.