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

新手上路,请多包涵

我有一种从 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();
}

问题:

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

原文由 Justin Tennant 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 488
2 个回答

为了简化读取操作,请考虑在数据之前存储 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
}

原文由 alexm 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果您使用的是 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;
}

原文由 Olipro 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题