Как я могу обнаружить/контролировать уровень внутренней буферизации в fstream C++?

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

  •  20-08-2019
  •  | 
  •  

Вопрос

Скажем, я делаю это (надуманный пример):

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

Я предполагаю (надеюсь), что библиотека iostream выполняет здесь некоторую внутреннюю буферизацию и не превращает это в миллионы операций чтения однобайтовых файлов на уровне ОС.

Есть ли способ:

а) Узнать размер внутреннего буфера ifstream?

б) Изменение размера внутреннего буфера ifstream?

Я пишу файловый фильтр, который должен читать файлы размером в несколько гигабайт небольшими порциями, и мне хотелось бы поэкспериментировать с разными размерами буфера, чтобы посмотреть, повлияет ли это на производительность.

Это было полезно?

Решение

Вы можете использовать ios::rdbuf() чтобы получить указатель на streambuf объект.Этот объект представляет внутренний буфер для потока.

Вы можете позвонить streambuf::pubsetbuf(char * s, streamsize n) установить новый внутренний буфер заданного размера.

Видеть эта ссылка Больше подробностей.

редактировать: Вот как это будет выглядеть в вашем случае:


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

редактировать: как отметил литб, фактическое поведение streambuf::pubsetbuf является «определяемым реализацией».

Если вы действительно хотите поиграть с буферами, вам, возможно, придется создать собственный класс буферизации, который наследуется от streambuf.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top