c++ 如何将二进制文件读入无符号整数的向量

rdlzhqv9  于 2023-04-13  发布在  其他
关注(0)|答案(1)|浏览(107)

我正在用C++做一个排序算法,它从一个二进制文件中获取数据。这个文件只包含unsigned int,文件的前4个字节显示了它所拥有的元素数量。接下来的4个字节块包含了需要排序的无符号整数。

ifstream ifs(INPUT_FILE_NAME,ios::binary);
    ifs.seekg(0,ifs.end);
    int N=0;
    N=(int)ifs.tellg();
    vector<unsigned int> buf(N / sizeof(unsigned int));// reserve space for N/4 unsigned int
    ifs.read(reinterpret_cast<char*>(buf.data()), buf.size()*sizeof(unsigned int)); // char==byte

我引用了一个问题"how to efficiently read a binary file into a vector C++",所以,我试图将bin文件精确地放入向量中。但我不知道如何处理它。我试图将char转换为uint,但它不起作用。你能给予我一个提示吗?

rsaldnfx

rsaldnfx1#

你正在寻找ifs到文件的末尾,但是你忘记在调用read()之前寻找它回到文件的开头,所以read()没有任何东西可以读取。你需要第二次寻找,例如:

ifstream ifs(INPUT_FILE_NAME,ios::binary);

ifs.seekg(0, ifs.end);
size_t N = ifs.tellg();
ifs.seekg(0, ifs.beg); // <-- ADD THIS!

对于这个问题,你为什么要寻找ifs呢?你说文件中的第一个unsigned int告诉你要读取的后续unsigned int的数量,所以只从ifs读取,而不寻找它,例如:

ifstream ifs(INPUT_FILE_NAME, ios::binary);

uint32_t N = 0;
ifs.read(reinterpret_cast<char*>(&N), sizeof(uint32_t));

vector<uint32_t> buf(N);
ifs.read(reinterpret_cast<char*>(buf.data()), N * sizeof(uint32_t));

在这种情况下,如果您能够删除第一个unsigned int,则它将变得多余,因为您可以直接向文件系统询问文件的大小,例如:

ifstream ifs(INPUT_FILE_NAME, ios::binary);

vector<uint32_t> buf(filesystem::file_size(INPUT_FILE_NAME) / sizeof(uint32_t));
ifs.read(reinterpret_cast<char*>(buf.data()), buf.size() * sizeof(uint32_t));

或者,简单地从文件中读取,直到达到EOF,例如:

ifstream ifs(INPUT_FILE_NAME, ios::binary);

vector<uint32_t> buf;
buf.reserve(filesystem::file_size(INPUT_FILE_NAME) / sizeof(uint32_t));

uint32_t number;
while (ifs.read(reinterpret_cast<char*>(&number), sizeof(uint32_t)) {
    buf.push_back(number);
}

相关问题