首页 > 解决方案 > 将文件读入 C++ 一个“数组”对象(不是数组)

问题描述

有一个 C++ 库,其中一个函数需要一个array对象。

    void update(const std::array<T, AN>& input)

它的使用示例只是显示了一个假设的fill_buffer(),而不是读取文件的实际代码。

std::array<unsigned char, 512> buffer;

while (fill_buffer(buffer))
{
    hash_stream.update(buffer);
}

我认为这ifstream是读取文件的标准 C++ 方式,但ifstream::read()需要一个实际的数组,而不是一个array对象。那么,如何解决这个问题呢?我想到的方法是:

  1. 将文件数据读入一个实际的数组,然后将该数组复制到array对象中?
  2. 使用其他类而不是ifstream读取文件?

推荐的方法是什么?

标签: c++arrays

解决方案


好吧,我已经像这样检查过。

  1. 生成带有随机整数的 512b 文件 dd if=/dev/random of=512.bin bs=4 count=128 iflag=fullblock

  2. 写了这个程序

#include <iostream>
#include <fstream>
#include <array>
#include <cstring>

int main()
{
    constexpr size_t int_size = sizeof(int32_t);

    std::array< char, 512 > buffer;
    std::ifstream f("512.bin");
    f.read(buffer.data(), 512);
    f.close();

    union{
        int32_t ret;
        char conv[int_size];
    } conv;

    for(int i =0; i <512; i+=int_size)
    {
        std::memcpy( conv.conv, &(buffer[i]), int_size);
        std::cout << i << " - " << i+int_size << " = " << conv.ret << std::endl;
    }
}
  1. 运行后我得到这样的结果:
0 - 4 = 544950647
4 - 8 = -2064427695
8 - 12 = 1451754975
12 - 16 = 1292626444
16 - 20 = -1100810537
20 - 24 = -1835802020
24 - 28 = -5945583

所以在我看来,只需使用std::array::data()方法来获取封装数据的原始指针


推荐阅读