QT读取文件内容--read()参数中字符数组读满发生异常

QT使用符数组readbuf[128]循环读取文件时,出现乱码问题

 关键代码如图

 

当你使用file.read(rbuf, sizeof(rbuf))读取数据到字符数组rbuf时,如果读取满sizeof(rbuf)字节,最后一个字节将没有空间容纳null字符。如果没有null字符,将会导致字符数组被错误解释为无null结尾的字符串,从而导致乱码或未定义行为。乱码可能是因为不标准字符串之间的拼接造成的。

因此,正确的做法是将sizeof(rbuf)减去1,以确保留出一个字节来存储null字符,防止读取的字符串溢出字符数组。 

while (1) {
    char rbuf[128];
    memset(rbuf, 0, sizeof(rbuf));
    //这里减一
    int ret = file.read(rbuf, sizeof(rbuf) - 1);
    if (ret < 0) {
        ui->textEdit->setText("文件读取失败");
        file.close();
        return;
    } else if (ret == 0) {
        file.close();
        return;
    }
    QString txt = rbuf;
    ui->textEdit->setText(ui->textEdit->toPlainText() + txt);
}

这个代码一样可以解决问题,我的理解是QString::fromUtf8()方法会帮我们把buf处理为标准的字符串。

while (1) {
    char buf[128];
    memset(buf, 0, sizeof(buf));
    //这里读满128
    int ret = file.read(buf, sizeof(buf));
    if (ret < 0) {
        ui->textEdit->setText("文件读取失败");
        file.close();
        return;
    } else if (ret == 0) {
        file.close();
        return;
    }
    QString txt = ui->textEdit->toPlainText();
    //每次读取到的内容都会被追加到字符数组 buf 中,并通过 fromUtf8,fromLocal8Bit,fromLatin1 函数将其转换为QString,最后追加到 txt 中
    txt += QString::fromUtf8(buf); // 或者使用QString::fromLocal8Bit(buf)
    ui->textEdit->setText(txt);
}

结果都能完整输出

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值