使用Fstream读取二进制文件

Reading binary file with fstream

本文关键字:二进制文件 读取 Fstream 使用      更新时间:2023-10-16

我正在阅读带有fstream的二进制文件,并将信息存储在一个字符中:

int dataLength = 32;
int counter = 0;
char data[dataLength];
char PMTone[dataLength/4];
std::fstream *fs = new std::fstream(inputFileName,std::ios::in|std::ios::binary);
fs->read((char *)&data, dataLength);
//of the 32 characters in data[], I need first, 5th etc elements:
//fill first pmt info
for(int i=0; i<(dataLength/4); i++){
PMTone[i]=data[counter];
counter+=4;
}

现在,我将PMTONE [7]设置为一个测试:

PMTone[7] = "a";

我得到错误:

mdftree.cpp:92:21:错误:从" const char*"转换为无效 " char" [-fpermissive]

我不明白为什么pmtone []中的元素是char的指针,当pmtone []被定义为chars数组时。

当我确实将pmtone []视为一系列指针时:

(*PMTone)[7] = "a";

我得到了另一个我不明白的错误:

mdftree.cpp:91:18:错误:无效类型的" char [int]"数组 下标

这似乎暗示编译器根本不认为PMTONE []是一个数组,而只是指向字符的指针。

任何人都可以阐明这里发生的事情吗?为什么PMTONE []成为炭的一系列指针?

字面的 "a"不是字符。

您需要:

PMTone[7] = 'a';

"a"不是字符,它是字符数组,'a',其次是null终结者。

您需要

 PMTone[7] = 'a';

带单引号。顺便说一句,我很惊讶它较早地编译,因为数据未称为const。

PMTone本身是类型char[8],它是字符数组。但是,它衰减到指针,而(*PMTone)是第一个元素,类型char

数组是通过具有第一个元素的地址并访问索引的其他元素来存储值的一种方式。数组基本上是指第一个元素的指针。

创建chars

的数组时
char arr[n];

程序实际上为内存中的n个字符创建空间。

访问arr[0]时,请说这样的话:

arr[2] = 'a';

程序实际上是这样做的:

*(arr + 2) = 'a';

表示您正在访问一个字符,该字符与数组中第一个元素的内存位置更进一步(因此,arr + 2),第一个元素是arr[0]。第一个元素的地址是&(arr[0])arr。两者都是相同的值。

错误是您尝试将字符串"a"保存到char中的地方。

问题是您尝试通过取消给出的指针来修复它:

(*PMTone)[7] = "a"; // is the same as
(PMTone[0])[7] = "a"; // when it should be 
PMTone[7] = 'a';