Qt读写文件出现丢失固定值字节的问题(0x0d,0x0d 0x0a)

探讨了在使用Qt进行Bin文件读写时遇到的问题,特别是QIODevice::Text模式下字节0x0d丢失的现象。通过代码示例,详细分析了在不同文件打开模式下,Qt如何处理特殊字符如行尾终止符。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境:win10,Qt5.9.7 + msvc2017

问题:读bin文件时,发现出现丢失字节,且为固定字节0x0d,后查阅Qt帮助得知因为文件打开方式包含QIODevice::Text。

Constant

Description

QIODevice::Text

When reading, the end-of-line terminators are translated to '\n'. When writing, the end-of-line terminators are translated to the local encoding, for example '\r\n' for Win32.

QIODevice::Text的描述为:读取时,行尾终止符转换为'\n'。写入时,行尾终止符转换为本地编码,例如用于win32的'\r\n'。

后面针对两种情况做了测试。

写入代码:

    QString path = QDir::currentPath() + "/test.txt";
    QFile file(path);
    if(!file.open(QIODevice::WriteOnly|QIODevice::Text))
    {
        qDebug() << "write open file failed";
        return;
    }
    QByteArray array;
    array.clear();
    char temp = 13;
    array.append(temp);
    temp = 10;
    array.append(temp);
    temp = 1;
    array.append(temp);
    temp = 12;
    array.append(temp);

    QTextStream in(&file);
    in.setCodec(QTextCodec::codecForName("UTF-8"));
    in<<array;
    file.close();

 按顺序写入0x0d,0x0a,0x01,0x0c;

读取代码:

    QString xmlfilepath = QFileDialog::getOpenFileName(this, tr("Open XML File"), QDir::currentPath(), "*.txt");

    QFile tagfile(xmlfilepath);
    if(!tagfile.open(QIODevice::ReadOnly ))
    {
        qDebug() << "(read)Open Tag.csv file failed !";
        return ;
    }
    QTextStream out(&tagfile);
    out.setCodec(QTextCodec::codecForName("GB18030"));
    QString str = out.readAll();

    //QByteArray array = tagfile.readAll();
    tagfile.close();
    qDebug() << str;

不带QIODevice::Text读取结果如下:

"\r\r\n\u0001\f"

会比理论写入多一个'\r'字符。

带QIODevice::Text读取结果如下:

"\n\u0001\f"

会将字符'\r'也就是字节0x0d丢掉。

补充:

字符描述
\n换行(LF)10
\f换页(FF)12
\r回车(CR)13

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值