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);
}
结果都能完整输出