我有一个程序可以编写一个与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
,并且所写的文件包含用于绘图的数据和基于条件的各种设置,因此我不知道如何将这些设置放在缓冲区中。
答案 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()
。