我有一个巨大的连续数组x
,我fread
来自一个文件。
如何将此块放入std::vector<>
?换句话说,我更喜欢将结果放在std::vector<>
而不是数组中,但我希望得到的C ++代码与这个将Cunk版本直接放入数组的普通C版本一样高效。 / p>
从搜索周围,我想我可能不得不以某种形式使用placement-new,但我不确定呼叫顺序和所有权问题。另外,我是否需要担心对齐问题?
我正在使用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 );
答案 0 :(得分:10)
使用设置向量大小的std::vector
constructor,并使用std::vector::data
获取指向已分配内存的指针。
保持使用fread
:
std::vector<T> x(big_n);
fread(x.data(), sizeof(T), big_n, fp);
如其他人所述,如果fread
类型不是POD type,则使用T
很可能无效。然后,您可以使用C ++流和std::istreambuf_iterator
将文件读入向量。然而,这有一个缺点,即它遍历文件中的所有项目,如果big_n
与声音一样大,那么这可能是性能问题。
但是,如果文件确实很大,我建议使用memory mapping来读取文件。
答案 1 :(得分: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