将二进制文件读入整型数组
Reading Binary Files into an array of ints 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();
}
问题:
如何完成读取二进制文件的功能实现?
如果你使用的是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是我的类,它创建不带向量的动态数组,有些安全,包含析构函数
相关文章:
- 无法在 Arduino 中uint8_t数组转换为无符号长整型数组
- 如何将SHA1转换为无符号长整型数组[5]
- 我需要以相反的方式复制一个长整型数组,我需要系统函数,例如 memcpy 有没有
- 复制存储在空指针的整型数组到整型数组
- 如何使用SSE来处理整型数组,使用条件
- 序列化/反序列化整型数组为char数组
- c++将整型数组赋值给大小相同的空整型数组
- 按值传递时改变整型数组的大小
- c++排序(升序,降序)整型数组
- 将字符串转换为整型数组
- 将二进制文件读入整型数组
- 在整型数组的最后一个元素中存储数据的问题
- 读取文件并将其作为整型数组输入
- 稍后在{}中添加无符号整型数组
- 用户输入存储在整型数组中的值c++
- 当使用整型数组的一部分时
- 将整型数组传递给c++ DLL
- 将字符数组转换为整型数组
- 引用整型数组的指针
- 比较浮点数组和整型数组