C++ 避免在C+中使用memcpy+;缓冲输出

C++ 避免在C+中使用memcpy+;缓冲输出,c++,linux,fstream,buffered,C++,Linux,Fstream,Buffered,我试图直接写入fstream输出缓冲区,以避免出现memcpy 为什么下面的代码不起作用 它在Linux上编译、运行并生成正确长度的输出文件。但输出文件不包含正确的文本。还要注意,由于某种原因,当我注释掉涉及str2的两行时,就会生成一个长度为零的输出文件 注意:此示例不会避免memcpy,但如果它起作用,将帮助我避免应用程序中出现memcpy #include <fstream> int main(int argc, char *argv[]) { std::fstream

我试图直接写入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();
}
#包括
int main(int argc,char*argv[]){
std::fstream out;
字符缓冲区[512];
out.rdbuf()->pubsetbuf(缓冲区,512);
打开(“file.txt”,std::fstream::out);
char*str1=“测试文本。”;
strcpy(缓冲区,str1);
out.rdbuf()->pubseekpos(strlen(str1),std::ios_base::out);
char*str2=“为什么?”;

现在还早,但你基本上不是在做什么吗

#include <fstream>

int main(int argc, char *argv[]) 
{

  std::fstream out;
  out.open("file.txt", std::fstream::out);

  out << "test text";
  out << "why?";

  out.flush();
  out.close();
}
#包括
int main(int argc,char*argv[])
{
std::fstream out;
打开(“file.txt”,std::fstream::out);

现在还早,但你基本上不是在做什么吗

#include <fstream>

int main(int argc, char *argv[]) 
{

  std::fstream out;
  out.open("file.txt", std::fstream::out);

  out << "test text";
  out << "why?";

  out.flush();
  out.close();
}
#包括
int main(int argc,char*argv[])
{
std::fstream out;
打开(“file.txt”,std::fstream::out);

我不太熟悉C++的IOSFATH库来说明你的程序有什么问题,我只想说如果你想自己做缓冲,直接使用读()和写()接口可能更直接(MAN 2写)如果你自己做缓冲,IoSt流库可能不会给你带来太多的东西,而且只会掩盖实际发生的事情。

< P>我不太熟悉C++的IOSLASH库来说明你的程序有什么问题,我只想说如果你想自己做缓冲的话,使用T可能更直接。他直接读取()和写入()接口(man 2 write)。如果您自己进行缓冲,iostream库可能不会给您带来太多好处,并且只会掩盖实际发生的情况。

当您
out.rdbuf()->pubsekpos(strlen(str1),std::ios\u base::out);
,这会要求流向前跳过新创建的文件。您是否希望它从您指定的缓冲区中提取内容?提示:您是否看到过任何涉及指定缓冲区的示例,其中说明您需要以某种方式对其进行初始化或指定其包含的非垃圾字符的初始数量?否…因为流本身跟踪缓冲区的哪些部分正在使用。因此-当您获取假定的空缓冲区并向前跳过时,它会生成中间的NUL。在缓冲区中设置NUL是没有意义的(因此在
pubseekpos
之后简单地执行
memcpy
也不会起作用)-如果您向前跳转的缓冲区大小超过一个,该怎么办

希望这至少能说明这个问题,尽管在这个阶段我没有考虑如何强制流改变它对有意义的缓冲区内容的“跟踪”…

当您
out.rdbuf()->pubseekpos(strlen(str1),std::ios\u base::out);
,这会要求流向前跳过新创建的文件。您是否希望它从您指定的缓冲区中提取内容?提示:您是否看到过任何涉及指定缓冲区的示例,其中说明您需要以某种方式对其进行初始化或指定其包含的非垃圾字符的初始数量?否…因为流本身跟踪缓冲区的哪些部分正在使用。因此-当您获取假定的空缓冲区并向前跳过时,它会生成中间的NUL。在缓冲区中设置NUL是没有意义的(因此在
pubseekpos
之后简单地执行
memcpy
也不会起作用)-如果您向前跳转的缓冲区大小超过一个,该怎么办


希望这至少能说明这个问题,尽管在这个阶段我没有考虑如何强制流改变它对有意义的缓冲区内容的“跟踪”…

你给流一个缓冲区供它内部使用。然后你就不给它任何东西来写了

将某些内容复制到缓冲区而不告诉流这一事实不会在文件中提供任何内容


正如您可能已经注意到的,seekpos用于在文件中定位,而不是在缓冲区中移动。缓冲区仅用于流的内部使用!

您为流提供了一个缓冲区,以供其内部使用。然后,您不给它任何可写入的内容

将某些内容复制到缓冲区而不告诉流这一事实不会在文件中提供任何内容


正如您可能已经注意到的,seekpos用于在文件中定位,而不是在缓冲区中移动。缓冲区仅用于流的内部使用!

我看到了三种可能性

  • 实现您自己的流缓冲区类
  • 使用本机文件API
  • 使用
    pubsetbuf(0,0)
  • 实现流缓冲区并不是那么困难,它将给您机会将C++样式流插入与直接内存访问混合,而不需要


    牺牲性能。

    我认为有三种可能性

  • 实现您自己的流缓冲区类
  • 使用本机文件API
  • 使用
    pubsetbuf(0,0)
  • 实现流缓冲区并不是那么困难,它将给您机会将C++样式流插入与直接内存访问混合,而不需要


    牺牲性能。

    避免使用memcpy
    ——对不起,这太傻了。
    memcpy
    是最快的操作之一。你真的确定
    memcpy
    的成本与实际完成的I/O成本相比真的很重要吗?你分析过它了吗?这可能只是一个过早的优化,你知道吗你应该