将二进制文件读入整型数组

Reading Binary Files into an array of ints c++

本文关键字:整型 数组 二进制文件      更新时间:2023-10-16

我有一个从int数组写入二进制文件的方法。(也可能是错的)

void bcdEncoder::writeBinaryFile(unsigned int packedBcdArray[], int size)
{
    fstream binaryIo;
    binaryIo.open("PridePrejudice.bin", ios::out| ios::binary | ios::trunc);
    binaryIo.seekp(0);
    binaryIo.write((char*)packedBcdArray, size * sizeof(packedBcdArray[0]));
    binaryIo.seekp(0);
    binaryIo.close();
}

我现在需要读取二进制文件。最好是在没有任何信息丢失的情况下将它读回另一个unsigned int数组。

我有一些类似下面的代码,但我不知道如何读取二进制文件真正工作,也不知道如何将其读取到int s数组中。

void bcdEncoder::readBinaryFile(string fileName)
{
    // myArray = my dnynamic int array
    fstream binaryIo;
    binaryIo.open(fileName, ios::in | ios::binary | ios::trunc);
    binaryIo.seekp(0);
    binaryIo.seekg(0);
    binaryIo.read((int*)myArray, size * sizeof(myFile));
    binaryIo.close();
}

问题:

如何完成读取二进制文件的功能实现?

如果你使用的是c++,请使用std库。

vector<unsigned int> bcdEncoder::readBinaryFile(string fileName)
{
    vector<unsigned int> ret; //std::list may be preferable for large files
    ifstream in{ fileName };
    unsigned int current;
    while (in.good()) {
        in >> current;
        ret.emplace_back(current);
    }
    return ret;
 }

的编写同样简单(为此我们将接受int[],但最好使用std库):

void bcdEncoder::writeBinaryFile(string fileName, unsigned int arr[], size_t len)
{
    ofstream f { fileName };
    for (size_t i = 0; i < len; i++)
        f << arr[i];
}

这里是相同的,但有一个std::vector

void bcdEncoder::writeBinaryFile(string fileName, vector<unsigned int> arr)
{
    ofstream f { fileName };
    for (auto&& i : arr)
        f << i;
}

为了简化读操作,考虑将size(即数组中元素的数目)存储在数据之前:

void bcdEncoder::writeBinaryFile(unsigned int packedBcdArray[], int size)
{
   fstream binaryIo;
   binaryIo.open("PridePrejudice.bin", ios::out| ios::binary | ios::trunc);
   binaryIo.seekp(0);
   binaryIo.write(&size, sizeof(size));
   binaryIo.write((char*)packedBcdArray, size * sizeof(packedBcdArray[0]));
   binaryIo.close();
}

读取的内容看起来像:

void bcdEncoder::readBinaryFile(string fileName)
{
    std::vector<unsigned int> myData;
    int size;
    fstream binaryIo;
    binaryIo.open(fileName, ios::in | ios::binary | ios::trunc);
    binaryIo.read(&size, sizeof(size)); // read the number of elements 
    myData.resize(size); // allocate memory for an array 
    binaryIo.read(myData.data(), size * sizeof(myData.value_type));
    binaryIo.close();
   // todo: do something with myData
}

使用std::array

下面的代码片段使用更现代的c++将二进制文件读入std::array


    const int arraySize = 9216; // Hard-coded
    std::array<uint8_t, arraySize> fileArray;
    std::ifstream binaryFile("<my-binary-file>", std::ios::in | std::ios::binary);
    if (binaryFile.is_open()) {
        binaryFile.read(reinterpret_cast<char*>(fileArray.data()), arraySize);
    }

因为使用的是std::array,所以需要在编译时知道文件的确切大小。如果您事先不知道文件的大小(或者更确切地说,您需要知道文件至少有X字节可用),请使用std::vector并查看下面的示例:https://stackoverflow.com/a/36661779/1576548

谢谢你的提示,看起来我已经搞定了!!我的问题的一个主要部分是,我添加到方法中的参数和语法有一半是不必要的,实际上把事情搞砸了。以下是我的工作方法。

void bcdEncoder::writeBinaryFile(unsigned int packedBcdArray[], int size, string fileName)
{
    ofstream binaryIo;
    binaryIo.open(fileName.substr(0, fileName.length() - 4) + ".bin", ios::binary);
    if (binaryIo.is_open()) {
        binaryIo.write((char*)packedBcdArray, size * sizeof(packedBcdArray[0]));
        binaryIo.close();
        // Send binary file to reader
        readBinaryFile(fileName.substr(0, fileName.length() - 4) + ".bin", size);
    }
    else
        cout << "Error writing bin file..." << endl;
}

和read:

void bcdEncoder::readBinaryFile(string fileName, int size)
{
    AllocateArray packedData(size);
    unsigned int *packedArray = packedData.createIntArray();
    ifstream binaryIo;
    binaryIo.open(fileName, ios::binary);
    if (binaryIo.is_open()) {
        binaryIo.read((char*)packedArray, size * sizeof(packedArray[0]));
        binaryIo.close();
        decodeBCD(packedArray, size * 5, fileName);
    }
    else
        cout << "Error reading bin file..." << endl;
}

AllocateArray是我的类,它创建不带向量的动态数组,有些安全,包含析构函数