我正在尝试直接写入 fstream 输出缓冲区以避免 memcpy
。
为什么下面的代码不起作用?
它在 Linux 上编译、运行并生成正确长度的输出文件。但是输出文件不包含正确的文本。另请注意,出于某种原因,当我注释掉涉及 str2
的两行时,会生成一个零长度的输出文件。
注意:这个例子没有避免memcpy
,但如果它有效,它将帮助我在我的应用程序中避免memcpy
。
#include <fstream>
int main(int argc, char *argv[]) {
std::fstream out;
char buffer[512];
out.rdbuf()->pubsetbuf(buffer, 512);
out.open("file.txt", std::fstream::out);
char *str1 = "test text.";
strcpy(buffer, str1);
out.rdbuf()->pubseekpos(strlen(str1), std::ios_base::out);
char *str2 = "why?";
out << str2;
out.flush();
out.close();
}
最佳答案
您为流提供一个缓冲区以供其内部使用。然后你什么都不给它写。
事实上,您将某些内容复制到缓冲区而没有告诉流并不会在文件中为您提供任何内容。
您可能已经注意到,seekpos 用于在文件中定位,而不是用于在缓冲区中移动。缓冲区仅供流的内部使用!
关于c++ - 在 C++ 缓冲输出中避免 memcpy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5799405/