c++ - 在 C++ 缓冲输出中避免 memcpy

标签 c++ linux fstream buffered

我正在尝试直接写入 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/

相关文章:

c++ - 复制构造函数是否调用默认构造函数来创建对象

linux - 删除明确的 unix 文件权限

linux - 使用Bash脚本通过SSH输出服务器上的所有文件夹

c++ - 关闭 fstream 以便可以在代码中进一步编辑文件

c++ - 将其中包含结构的 vector 序列化为 .dat 文件时,我做错了什么?

c++ - 可变参数/非可变参数模板之间的函数类型衰减不一致?

c++ - 澄清指向函数转换的指针

c++ - 有哪些技巧可以使具有大量计算的函数变得干净?

c# - 如何检测我是否在单一服务中运行?

c++ - 以相反的顺序从文本文件中读取行 C++