废话不多说,上代码
// 问题代码
uint32_t clacFileCrc(const string& fileName)
{
ifstream file;
file.open(fileName);
if (!file.is_open())
{
return false;
}
memset(readbuf, 0, sizeof(readbuf));
file.read(readbuf,sizeof(readbuf));
string str(readbuf);
file.close();
return Crc::calc32Bit_S12X(0x20190805, str);
}
上述代码读取文件后,readbuf中只有/n存在,但是文件中确实存在/r,由于读取到的文件大量缺失/r,最终导致crc计算错误,如何修改呢?
// bug fix代码
uint32_t clacFileCrc(const string& fileName)
{
ifstream file;
// 以二进制读取
file.open(fileName, ios::binary);
if (!file.is_open())
{
return false;
}
memset(readbuf, 0, sizeof(readbuf));
file.read(readbuf,sizeof(readbuf));
string str(readbuf);
file.close();
return Crc::calc32Bit_S12X(0x20190805, str);
}
使用二进制读取可以确保读取文件全部内容
小结
源程序在另一个qt构建的项目中,坑爹qfile默认就是二进制读取,我以为c++也是如此,结果便耗费了我几个小时的时间- -