为了账号安全,请及时绑定邮箱和手机立即绑定

将文件读入std :: vector <char>的有效方法?

将文件读入std :: vector <char>的有效方法?

C++
斯蒂芬大帝 2019-10-21 09:42:14
我想避免不必要的复制。我的目标是:std::ifstream testFile( "testfile", "rb" );std::vector<char> fileContents;int fileSize = getFileSize( testFile );fileContents.reserve( fileSize );testFile.read( &fileContents[0], fileSize );(这是行不通的,因为reserve实际上并未在向量中插入任何内容,因此我无法访问[0])。当然std::vector<char> fileContents(fileSize)可以,但是初始化所有元素会产生开销(fileSize可能会很大)。相同resize()。这个问题并不是关于开销有多重要。相反,我只是想知道是否还有另一种方法。
查看完整描述

3 回答

?
叮当猫咪

TA贡献1776条经验 获得超12个赞

规范形式是这样的:


#include<iterator>

// ...


std::ifstream testFile("testfile", std::ios::binary);

std::vector<char> fileContents((std::istreambuf_iterator<char>(testFile)),

                               std::istreambuf_iterator<char>());

如果您担心重新分配,请在向量中保留空间:


#include<iterator>

// ...


std::ifstream testFile("testfile", std::ios::binary);

std::vector<char> fileContents;

fileContents.reserve(fileSize);

fileContents.assign(std::istreambuf_iterator<char>(testFile),

                    std::istreambuf_iterator<char>());


查看完整回答
反对 回复 2019-10-21
?
噜噜哒

TA贡献1784条经验 获得超7个赞

如果要进行真正的零拷贝读取,也就是说,要消除从内核到用户空间的复制,只需将文件映射到内存即可。编写自己的映射文件包装器,或使用中的一个boost::interprocess


查看完整回答
反对 回复 2019-10-21
?
BIG阳

TA贡献1859条经验 获得超6个赞

如果我对您的理解正确,那么您想阅读每个元素,但又不想将所有元素都加载到fileContents,对吗?我个人认为这不会产生不必要的副本,因为多次打开文件会进一步降低性能。fileContents在这种情况下,一次读入向量是一个合理的解决方案。


查看完整回答
反对 回复 2019-10-21
  • 3 回答
  • 0 关注
  • 1224 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信