gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 19:59:08 25 4
gpt4 key购买 nike

关于早期 question 的后续问题我有,这已经得到了完美的回答。快速回顾一下,我在创建一个包含巨大数组的类时遇到了麻烦(堆栈溢出错误)。在答案中,一些用户建议我改用 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);
}

myarray 看起来像这样:

int myarray[45000000];

我的问题是:我怎样才能更好地理解它:

std::vector<int> myvector;

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

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));

实现这个之后,当调用 myvector.size() 时,我得到 16(无论出于何种原因),并且访问 vector 元素会导致立即崩溃,因为超出了 vector 边界。

那么我需要做什么才能做到这一点?我曾经在某处读到我可以简单地使用“旧”方法,然后将数组读入 vector ,但这似乎首先违背了使用 vector 的目的。

最佳答案

fread()读取你的文件二进制,而ifstream_iterator尝试提取格式化 整数(如 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());

请注意,您需要使用 std::vector<char>read期望第一个参数是 char * .您可以使用其他类型 T如果你正确地转换类型:

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

关于c++ - 如何在二进制文件上使用 fread() 将数据读入 std::vector?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15143670/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com