如何在二进制文件上使用fread()将数据读入std::vector
How can I use fread() on a binary file to read the data into a std::vector?
我之前有一个问题的后续问题,这个问题已经得到了完美的回答。快速回顾一下,我在创建一个包含巨大数组的类时遇到了麻烦(堆栈溢出错误)。在回答中,一些用户建议我使用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;
我搜索了谷歌,发现了多个答案,通常指向以下代码:
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(无论出于什么原因),并且访问向量元素会导致超出向量边界的立即崩溃。
那么我要怎么做才能做对呢?我曾经在某个地方读到,我可以简单地使用"旧"方法,然后将数组读入向量,但这似乎违背了首先使用向量的目的。
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());
注意,您需要使用std::vector<char>
,因为read
期望第一个参数是char *
。如果正确转换类型,可以使用其他类型T
:
input.read(reinterpret_cast<char*>(&myvector[0]), myvector.size() * sizeof(T));
如果你正在使用c++,你应该尽量避免同时使用C FILE
api——这样你就在正确的轨道上了。您遇到的问题是istream_iterator
将输入读取为文本,而不是二进制-它期望ASCII数字。This This out:
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]));
相关文章:
- std::ranges::elements_view,用于自定义类似元组的数据
- 使用 std::vector<double> 访问由 std::unique_ptr<double[2] 管理的数据>
- 检查输入 std::array 指针数据是否等于某个常量数组
- 是否可以使用 std::array 作为 POD 结构的数据容器?
- 在 std::vector<无符号字符中存储任意数据的方法>
- std::weak_ptr 和相应的 std::shared_ptr 之间是否存在数据竞争?
- 有效地将数据加载到 std::vector 中<char>
- std::bad_alloc 在大数据集的 Dijkstra 计算期间
- 将数据从 std::Vector 存储到 Eigen::Vector 时出错
- C++中的多维数据集:从 std::vector 的 2D 数据到 std::vector 的 2D 网格的最干净方法?
- 简单使用 std::atomic 在两个线程之间共享数据
- 在哪里可以找到 std::bitset 的数据成员?
- 从 std::string 到 std::array<char,size> 的 memcopy 额外数据是否是一种未定义的行为?
- 使用 std::locale 格式化法语数字时无效的 UTF-8 数据
- 我可以在 std::shared_mutex 上使用 std::shared_lock 更改数据吗?
- 如何将 std::vector 索引交换到<int>数据,将数据交换到索引
- C++ C4244 =':从"std::streamsize"转换为"无符号短",可能会丢失数据;有什么解决办法吗?
- 为什么 std::set 容器使用的内存比其数据大小多得多?
- 如何使用派生类类型数据初始化 std::shared_ptr?
- 在std::线程中使用已分配的结构数据