今天发现QT以文本方式写入文件0x0a会出现问题,写入的是一个字节,结果显示是2个字节。
代码如下
QString FilePath = qApp->applicationDirPath();
QString creatbinPath = FilePath + "/wav.bin";
QFile::remove(creatbinPath);//删除文件
QFile creatbin(creatbinPath);
if(!creatbin.isOpen())
{
if (!creatbin.open(QIODevice::ReadWrite|QIODevice::Append|QIODevice::Text))
{
ui->outname->addItem("打开.bin文件失败");
return ;
}
}
char fileaddr = 0x0a;
creatbin.write((const char *)&fileaddr,1);
creatbin.close();
但是我只要把0x0a换成别的都是正确的,被这个问题困扰了一下。
0A是什么?0D 0A又是什么?这个问题的解原来在这里。先查查C++的文档,里面说明,ofstream的open函数,第二个参数指明打开方式,缺省为ios_base::out,即按照字节流的方式输出文本。再看看0A到底是什么,原来ASCII的0A是换行,也就是\n,再想想,Windows系统下的换行是如何处理的?\r\n啊。原来……
原来按照字节流的形式输出文本时,ofstream会自动将输出的\n变成\r\n,以适应WIndows系统,结果以输出数据的角度看来,这个正常的举动就变成了不可解的“0A变成0D 0A”。
解决方法如下,删除以文本方式打开文件即可。
QString FilePath = qApp->applicationDirPath();
QString creatbinPath = FilePath + "/wav.bin";
QFile::remove(creatbinPath);//删除文件
QFile creatbin(creatbinPath);
if(!creatbin.isOpen())
{
if (!creatbin.open(QIODevice::ReadWrite|QIODevice::Append))
{
ui->outname->addItem("打开.bin文件失败");
return ;
}
}
char fileaddr = 0x0a;
creatbin.write((const char *)&fileaddr,1);
creatbin.close();