C ++如何在ofstream中实际使用pubsetbuf?

时间:2016-10-28 16:28:43

标签: c++ buffer ofstream

我有一个程序可以编写一个与gnuplot一起使用的临时文件。文件大小不一,如果不是MB,它可以达到数百KB。每次将其写入磁盘时,strace一次只显示大约8kB。我想通过设置大于此的缓冲区来避免不必要的磁盘写入。其中一个答案就是在SO上说,在开始表现不好之前,128kB是最大的。我搜索过并发现我可以修改缓冲区,如下所示:

int sz {65536};
char buf[sz];
std::ofstream outf {"file.txt"};
outf.rdbuf()->pubsetbuf(&buf[0], sz);

到目前为止,它很好,它编译,但我如何实际使用此缓冲区?在其中一个答案中,我已经看过使用reinterpret_cast,但我并不真正理解那里发生了什么。 C ++参考站点也不是很有帮助。我不是高级程序员,有人可以告诉我如何使用它吗?我正在使用ofstream,并且所写的文件包含用于绘图的数据和基于条件的各种设置,因此我不知道如何将这些设置放在缓冲区中。

2 个答案:

答案 0 :(得分:3)

根据@pantarei和@lightnessracesinorbit的建议,我会写出答案。如果我遵守规则,我会道歉。

根据cppreference网站,设置pubsetbuf的顺序很重要,因为在打开任何文件之前需要设置,否则它无效。所以,这是代码的顺序(对于我的情况):

int sz {131072};          // buffer size
std::vector<char> buf;   // std::vector instead of C-style char
buf.resize(sz);
std::ofstream outf;      // declaration, only
outf.rdbuf()->pubsetbuf(&buf[0], sz);  // set buffer before...
outf.open("file.txt");                 // ...opening the file
// rest of the code

我的文件通常低于100k,因此128k缓冲区可以避免写入太多。

答案 1 :(得分:2)

reference documentation明确指出(强调我的):

  

2)此功能的基类版本无效。派生类可以覆盖此函数,以允许使用用户提供的数组删除或替换受控字符序列(缓冲区),或者用于任何其他特定于实现的目的。

所以扩展缓冲区需要的是std::basic_filebuf::setbuf()