QT读写文件方法介绍以及编码问题解决

2 篇文章 0 订阅
本文介绍了在Qt中使用QFile和QTextStream进行文件读写,特别是如何确保数据以UTF-8编码保存。通过QFile的open方法设置Text标志和QTextStream的setCodec方法,可以正确处理编码问题,避免出现ANSI格式导致的读写差异。
摘要由CSDN通过智能技术生成

说明

当在qt中要进行文件的读写时,qt提供QFile类帮助我们进行文件的读写操作。这其中我们需要使用到open与write两个主要的方法。但如果使用write方法去写入文件并保存时,会出现无法保存为UTF-8的编码格式,下面是对open、write方法的介绍以及如何将数据保存为UTF-8的格式。

open

这里对open方法只进行一个简单的介绍,老规矩,先看一下官方文档中的说明:

[override virtual] bool QFile::open(QIODevice::OpenMode mode)
Reimplements: QIODevice::open(QIODevice::OpenMode mode).
Opens the file using OpenMode mode, returning true if successful; otherwise false.
The mode must be QIODevice::ReadOnly, QIODevice::WriteOnly, or QIODevice::ReadWrite. It may also have additional flags, such as QIODevice::Text and QIODevice::Unbuffered.

文档中说明open方法是一个支持重写的虚方法,所以其有多种重写实现,这里不一一展现。在使用open方法时,需要传入其所支持的模式标志。

write

write方法支持一个参数或两个参数

*qint64 QIODevice::write(const char data, qint64 maxSize)
qint64 QIODevice::write(const char *data)(This is an overloaded function.)

向文件中写入最多maxSize大小的data中的数据,成功写入会返回真实写入的字节大小,执行异常则返回-1。两个方法效果相同。

示例

需引入QFile库

QFile file("./Test.txt");
if (file.open(QIODevice::WriteOnly | QIODevice::Append | QIODevice::Text)) {
	QString strTest = "input test text to file";
	file.write(strTest..toUtf8().data());
    file.close();
}

编码问题解决

当使用上述方法去读写*.json类文件时,会出现保存后的文件的编码格式为ANSI,导致读写之间出现差异,此时,我们可以使用 QTextStream 类对文件进行保存。示例如下:

    QFile file("./Test.json");
    if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text)){
        return ;
    }
    QString strJson;
    strJson= ""{\"error\":0}";
    QTextStream streamFileOut(&file);
    streamFileOut.setCodec("UTF-8");  							//设置编码格式
    streamFileOut<<strConfigContent;			
    streamFileOut.flush();													//刷新等待写入的数据
    streamFileOut.setGenerateByteOrderMark(false);		//if false no BOM will be inserted
    file.close();

Qt中,可以使用QAudioDecoder和QAudioEncoder类来实现.wav文件读写操作。 读取.wav文件: ```cpp QAudioDecoder decoder; decoder.setSourceFilename("audio.wav"); // 设置要读取的.wav文件名 QObject::connect(&decoder, &QAudioDecoder::bufferReady, [&](const QAudioBuffer& buffer){ // 处理读取到的音频数据 const qint16* data = buffer.constData<qint16>(); int sampleCount = buffer.sampleCount(); int channelCount = buffer.channelCount(); int sampleRate = buffer.format().sampleRate(); // 进行相应的处理 }); decoder.start(); // 开始读取.wav文件 ``` 写入.wav文件: ```cpp QAudioEncoderSettings settings; settings.setCodec("audio/pcm"); settings.setSampleRate(44100); settings.setChannelCount(2); settings.setSampleSize(16); settings.setQuality(QMultimedia::HighQuality); QAudioEncoder encoder; encoder.setAudioSettings(settings); encoder.setOutputLocation(QUrl::fromLocalFile("output.wav")); // 设置输出的.wav文件名 QObject::connect(&encoder, &QAudioEncoder::encodedAudioAvailable, [&](const QAudioEncoderControl::EncodedAudioBuffer& buffer){ // 处理编码后的音频数据 const QByteArray& data = buffer.data(); // 进行相应的处理 }); encoder.record(); // 开始录制音频数据 // 在需要录制的地方,使用encoder.encode()将音频数据传递给编码器 encoder.stop(); // 停止录制音频数据,并将编码后的数据写入.wav文件 ``` 请注意,以上代码只是演示了如何使用Qt进行.wav文件读写操作,具体的实现可能还需要根据实际需求进行适当的调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值