QT 文件操作 0A

今天发现QT以文本方式写入文件0x0a会出现问题,写入的是一个字节,结果显示是2个字节。

QT 文件操作 0A_第1张图片

代码如下

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();

 

 

 

 

 

你可能感兴趣的:(QT)