7

我有一个来自文件x的巨大连续数组。fread

如何将此块放入std::vector<>? 换句话说,我更喜欢将结果放入std::vector<>而不是数组,但我希望生成的 C++ 代码与将块直接放入数组的纯 C 版本一样高效。

通过搜索,我想我可能不得不以某种形式使用placement-new,但我不确定调用顺序和所有权问题。另外,我需要担心对齐问题吗?

我正在测试 with T = unsigned,但我希望有一个合理的解决方案适用于任何 POD 结构。

using T = unsigned;
FILE* fp = fopen( outfile.c_str(), "r" );
T* x = new T[big_n];
fread( x, sizeof(T), big_n, fp );

// how do I get x into std::vector<T> v
// without calling a gazillion push_backs() or copies ?!?

delete[] x;
fclose( fp );
4

2 回答 2

10

您使用设置向量大小的std::vector 构造函数std::vector::data,并用于获取指向已分配内存的指针。

与您的使用保持一致fread

std::vector<T> x(big_n);
fread(x.data(), sizeof(T), big_n, fp);

正如其他人所指出的,fread如果类型T不是POD 类型,则使用很可能不起作用。然后,您可以使用 C++ 流并将std::istreambuf_iterator文件读入向量。然而,这有一个缺点,它会遍历文件中的所有项目,如果big_n听起来像听起来那么大,那么这可能是一个性能问题。


但是,如果文件真的很大,我更推荐使用内存映射来读取文件。

于 2013-01-17T13:38:57.273 回答
0

这将使用将文件读入向量

#include <vector>
#include <fstream>
#include<iterator>
// ...

std::ifstream testFile("testfile", std::ios::binary);
std::vector<unsigned char> fileContents((std::istreambuf_iterator<unsigned char>(testFile)),
                           std::istreambuf_iterator<unsigned char>());

这个答案来自之前的答案:https ://stackoverflow.com/a/4761779/942596

于 2013-01-17T13:53:47.393 回答