如何使用带字符串的istream

hyp*_*not 10 c++ string gcc istream visual-studio

我想把一个文件读成一个字符串.我正在寻找有效的方法.

使用固定大小的*char缓冲区

我收到了Tony 的回答是什么创建了一个16kb的缓冲区并读入该缓冲区并附加缓冲区,直到没有其他内容可读.我理解它是如何工作的,我发现它非常快.我不明白的是,在答案的评论中,据说这种方式将所有内容复制两次.但据我所知,它只发生在内存中,而不是发生在磁盘上,所以它几乎是不可察觉的.它是从缓冲区复制到内存中的字符串的问题吗?

使用istreambuf_iterator

我收到的另一个答案是使用istreambuf_iterator.代码看起来美观而且极小,但速度极慢.我不知道为什么会这样.为什么那些迭代器这么慢?

使用memcpy()

对于这个问题,我收到的评论是我应该使用memcpy(),因为它是最快的本机方法.但是如何将memcpy()与字符串和ifstream对象一起使用?是不是ifstream应该使用自己的读取功能?为什么使用memcpy()破坏可移植性?我正在寻找与VS2010以及GCC兼容的解决方案.为什么memcpy()不适用于那些?

+还有其他任何有效的方法吗?

对于小的<10 MB二进制文件,你推荐什么,我使用什么shell?

(我不想将这个问题分成几部分,因为我对如何将ifstream读入字符串的不同方式之间的比较更感兴趣)

Kon*_*lph 10

它只发生在内存中,而不是发生在磁盘上,因此几乎不可察觉

这确实是正确的.不过,不这样做的解决方案可能会更快.

为什么那些迭代器这么慢?

代码很慢,不是因为迭代器,而是因为字符串不知道要分配多少内存:istreambuf_iterators只能遍历一次,因此字符串基本上被强制执行重复连接,结果是内存重新分配,这非常慢.

我最喜欢的单行,另一个答案是直接从底层缓冲区流式传输:

string str(static_cast<stringstream const&>(stringstream() << in.rdbuf()).str());
Run Code Online (Sandbox Code Playgroud)

在最近的平台上,这确实会预先分配缓冲区.但是它仍然会产生冗余副本(从stringstream最终字符串到最终字符串).