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

Mar*_*son 3 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);
   fclose(fstr);
}
Run Code Online (Sandbox Code Playgroud)

对于看起来像这样的myarray:

int myarray[45000000];
Run Code Online (Sandbox Code Playgroud)

我的问题是:我怎样才能把它读成一个更好的:

std::vector<int> myvector;
Run Code Online (Sandbox Code Playgroud)

我搜索了谷歌,并找到了多个答案,通常指向以下代码:

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));
Run Code Online (Sandbox Code Playgroud)

在实现之后,当调用myvector.size()时,我得到16(无论出于何种原因),并且访问向量元素会导致出现向量边界的立即崩溃.

那么我该怎么做才能做到这一点?我曾经读过某个地方,我可以简单地使用"旧"方法,然后将数组读入矢量,但这似乎首先打败了使用矢量的目的.

Zet*_*eta 6

fread()读取文件二进制文件,同时ifstream_iterator尝试提取格式化的 int(如42).

你想要resize你的vector并使用input.read(...):

const size_t size = 45000000; // change this to the appropriate value
std::vector<char> myvector(size, 0);
std::ifstream input("myfile.dat", std::ios::in | std::ifstream::binary);
input.read(&myvector[0], myvector.size());
Run Code Online (Sandbox Code Playgroud)

请注意,您需要使用a std::vector<char>,因此read需要第一个参数为a char *.T如果正确转换类型,则可以使用其他类型:

input.read(reinterpret_cast<char*>(&myvector[0]), myvector.size() * sizeof(T));
Run Code Online (Sandbox Code Playgroud)

  • @OliverCiappara 不。你*永远*不想为任何“std::vector”在“&amp;myvector[0]”或“myvector.data()”上调用“free”。`std::vector` 自行处理分配和释放。请记住:如果您没有调用“malloc”,则不得调用“free”(除非该函数的文档告诉您使用后者,例如 POSIX 中的“strdup”)。 (2认同)