C++ 如何在二进制文件上使用fread()将数据读入std::vector?

C++ 如何在二进制文件上使用fread()将数据读入std::vector?,c++,arrays,vector,ifstream,fread,C++,Arrays,Vector,Ifstream,Fread,我先前提出的一个问题已经得到了完美的回答。为了快速回顾,我在创建一个包含巨大数组的类时遇到了困难(堆栈溢出错误)。在回答中,一些用户建议我改用std::vector 读取数据的函数如下所示: Test() { memset(myarray, 0, sizeof(myarray)); FILE* fstr = fopen("myfile.dat", "rb"); size_t success= fread(myarray, sizeof(myarray), 1, fstr);

我先前提出的一个问题已经得到了完美的回答。为了快速回顾,我在创建一个包含巨大数组的类时遇到了困难(堆栈溢出错误)。在回答中,一些用户建议我改用std::vector

读取数据的函数如下所示:

Test()
{
   memset(myarray, 0, sizeof(myarray));
   FILE* fstr = fopen("myfile.dat", "rb");
   size_t success= fread(myarray, sizeof(myarray), 1, fstr);
   fclose(fstr);
}
int myarray[45000000];
对于如下所示的myarray:

Test()
{
   memset(myarray, 0, sizeof(myarray));
   FILE* fstr = fopen("myfile.dat", "rb");
   size_t success= fread(myarray, sizeof(myarray), 1, fstr);
   fclose(fstr);
}
int myarray[45000000];
我的问题是:我怎样才能把这个理解成一个更好的例子:

std::vector<int> myvector;
std::vector myvector;
我搜索了谷歌,找到了多个答案,通常指向以下代码:

std::ifstream input("myfile.dat", std::ios::in | std::ifstream::binary);
std::copy(std::istream_iterator<int>(input), 
     std::istream_iterator<int>(), 
     std::back_inserter(myvector));
std::ifstream输入(“myfile.dat”,std::ios::in | std::ifstream::binary);
std::copy(std::istream_迭代器(输入),
std::istream_迭代器(),
std::back_插入器(myvector));
在实现这一点之后,当调用myvector.size()时,我得到了16(无论出于何种原因),访问向量元素会导致超出向量边界的立即崩溃

那我该怎么做才能把事情做好呢?有一次我在某个地方读到,我可以简单地使用“old”方法,然后将数组读入向量,但这似乎违背了首先使用向量的目的。

fread()
读取文件二进制,而
ifstream\u迭代器试图提取格式化的int(如
42

您希望调整
向量的大小
并改为使用:


如果你使用C++,你应该尽量避免使用C<代码>文件< /COP> API,这样你就在正确的轨道上。您遇到的问题是,

istream\u迭代器
将输入读取为文本,而不是二进制——它需要ASCII数字。相反,这表明:

std::vector<int> vec(45000000);

std::filebuf fb;
fb.open("myfile.dat", std::ios_base::in | std::ios_base::binary);
fb.sgetn((char*)&vec[0], vec.size() * sizeof(vec[0]));
标准向量向量向量机(45000000); std::filebuf fb; open(“myfile.dat”,std::ios_base::in | std::ios_base::binary); fb.sgetn((char*)&vec[0],vec.size()*sizeof(vec[0]);
istream\u迭代器执行格式化输入。如果你的文件是二进制格式的,那就不是你想要的。@MichaelDorgan:一点也不读这个问题@MarkAnderson:
std::istream_迭代器执行格式化读取,而旧的
fread
是未格式化读取。你需要对向量进行无格式读取。然后我的评论就消失了——反正我更喜欢C:)完成后你需要在&myvector[0]上调用free()吗?@Oliver.a不。你永远不想在
上调用
free
或者
myvector.data()
任何
std::vector
<代码>标准::向量
自行处理分配和解除分配。请记住:如果您没有调用
malloc
,则不能调用
free
(除非函数的文档告诉您使用后者,例如POSIX中的
strdup
)。