Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;如何在流中实际使用pubsetbuf?_C++_Buffer_Ofstream - Fatal编程技术网

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

C++ C++;如何在流中实际使用pubsetbuf?,c++,buffer,ofstream,C++,Buffer,Ofstream,我有一个程序,可以编写一个临时文件,与gnuplot一起使用。该文件大小不一,如果不是MB,它可以达到数百kB。每次写入磁盘时,strace一次只显示大约8kB。我希望通过设置大于此值的缓冲区来避免不必要的磁盘写入。这里的一个答案是128kB,在它开始表现不好之前大约是最大值。我已经搜索并发现我可以修改缓冲区,如下所示: int sz {65536}; char buf[sz]; std::ofstream outf {"file.txt"}; outf.rdbuf()->pubsetbu

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

int sz {65536};
char buf[sz];
std::ofstream outf {"file.txt"};
outf.rdbuf()->pubsetbuf(&buf[0], sz);
到目前为止,很好,它可以编译,但是我实际上如何使用这个缓冲区呢?在其中一个答案中,我看到了使用
重新解释cast
,但我真的不明白那里发生了什么。C++参考站点也不是很有用。我不是高级程序员,有人能告诉我如何使用这个吗?我正在使用流的
,所写的文件既有用于打印的数据,也有基于条件的各种设置,因此我不知道如何将这些设置放入缓冲区。

清楚地说明(我的重点):

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

因此,您需要扩展缓冲区。

清楚地说明(强调我的):

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


因此,您需要扩展缓冲区。

根据@pantarei和@lightnessracesinorbit的建议,我将写下答案。如果我违反了规则,我道歉


根据CPPFerence网站,设置
pubsetbuf
的顺序很重要,因为它需要在打开任何文件之前进行设置,否则没有效果。因此,这是代码的顺序,因为它需要(对于我的情况):

intsz{131072};//缓冲区大小
标准::向量buf;//std::vector而不是C样式的字符
buf.resize(sz);
标准::流出流;//声明,仅限
outf.rdbuf()->pubsetbuf(&buf[0],sz);//在…之前设置缓冲区。。。
outf.open(“file.txt”);/。。。打开文件
//代码的其余部分

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

根据@pantarei和@lightnessracesinorbit的建议,我将写出答案。如果我违反了规则,我道歉


根据CPPFerence网站,设置
pubsetbuf
的顺序很重要,因为它需要在打开任何文件之前进行设置,否则没有效果。因此,这是代码的顺序,因为它需要(对于我的情况):

intsz{131072};//缓冲区大小
标准::向量buf;//std::vector而不是C样式的字符
buf.resize(sz);
标准::流出流;//声明,仅限
outf.rdbuf()->pubsetbuf(&buf[0],sz);//在…之前设置缓冲区。。。
outf.open(“file.txt”);/。。。打开文件
//代码的其余部分

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

你说的“如何实际使用此缓冲区”是什么意思?它由
outp
使用,并应用任何输出操作。那么,为什么每次写入约8kB的文件?上面的4行现在在代码中,但它们没有任何区别,所以我想我必须以某种方式使用
buf[sz]
。我错了吗?C++标准不支持代码> char Buf[sZ];<如果编译为扩展名,代码>可能会严重失败,导致堆栈溢出。@pantarei我使用这个:
outp作为输出缓冲区:作为输入缓冲区:“我实际上如何使用这个缓冲区?”是什么意思?它由
outp
使用,并应用任何输出操作。那么,为什么每次写入约8kB的文件?上面的4行现在在代码中,但它们没有任何区别,所以我想我必须以某种方式使用
buf[sz]
。我错了吗?C++标准不支持代码> char Buf[sZ];<如果编译为扩展名,code>可能很难溢出堆栈。@pantarei我使用这个:
Outp作为输出缓冲区:作为输入缓冲区:现在我发现我需要在“file.txt”之前添加行,所以现在我首先声明
Outp
,然后声明
pubsetbuf
,然后声明
Outp.open(“file.txt”)
,现在它一次就写出来了。谢谢。@AconedCitizen所以你接受了一个与你所说的实际解决方案无关的答案。@LightnessRacesinOrbit我已经在想这个问题了。但无法删除我的答案:P@LightnessRacesinOrbit这不仅是唯一的答案,也是让我走上正轨的答案,解决了问题。我不会说它“没有关系”。如果我需要帮助,有人会使用指导,而不是直接回答,而指导会使我走上正确的轨道,我不应该认为指导是有益的吗?至少,这是我的推理,你的,或者其他任何人,可能会有所不同。@aconcernedcidentity好吧,指导并不是我们想要在这里提出问题的方式。它是关于事实和简洁而坚实的解决方案。现在你的问题已经解决了,这很好,但也许你最好写下你自己的答案,然后发布我的答案,这样我就可以删除它了。正如LRIO提到的,它显然没有直接关系。现在我看到我需要在“file.txt”之前添加行,所以现在我首先声明
outp
,然后
pubstebuf
,然后
outp.open(“file.txt”)
,现在它可以一次性写入。谢谢你
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