Qt 5.9 C++ 开发指南 第7章 文件系统和文件读写

文章介绍了Qt框架中使用QFile类和QTextStream进行文本文件读写的两种方法,包括以只读方式打开文件、读取所有内容以及保存文件。QTextStream提供了方便的读写操作,并能自动处理Unicode编码,确保汉字的正确显示。同时,文章提到了解决中文乱码问题的方法,通过设置QTextCodec使程序支持UTF-8编码。
摘要由CSDN通过智能技术生成

7.1 文本文件读写

7.1.1 实例功能概述

Qt提供了两种读写纯文本文件的基础方法:

  • QFile类的IODevice读写功能直接进行读写;
  • 利用QFileQTextStream结合,用流(Stream)的方法进行文件读写。

7.1.2 QFile 读写文本文件

QFile类是直接与IO设备打交道,进行文件读写操作的类,使用QFile可以直接打开或保存文本文件。

QString fileName = QDir::currentPath() + "/file.txt";
QFile file(fileName);  //定义QFile对象变量时将文件名和文件所在路径传递给它
if (!file.exists())    //文件不存在
{
    return;
}
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) //以只读和文本方式打开
{
    return;
}
QString str = file.readAll();  //读取所有内容
file.close();  //关闭文件
  • QString QDir::currentPath():返回应用程序当前目录的绝对路径。
  • bool QFile::open():函数打开文件时需要传递QIODevice::OpenModeFlag枚举类型的参数,决定文件以什么方式打开。
    • QIODevice::ReadOnly:以只读方式打开文件,用于载入文件。
    • QIODevice::WriteOnly:以只写方式打开文件,用于保存文件。隐含着Truncate,即删除文件原有内容。
    • QIODevice::ReadWrite:以读写方式打开。
    • QIODevice::Append:以添加模式打开,新写入文件的数据添加到文件尾部。
    • QIODevice::Truncate:以截取方式打开文件,文件原有的内容全部删除。
    • QIODevice::Text:以文本方式打开文件,读取时\n被自动翻译为换行符,写入时字符串结束符会自动翻译为系统平台的编码,如Windows平台下是\r\n
      • 这些取值可以组合,例如 QIODevice::ReadOnly | QIODevice::Text表示以只读和文本方式打开文件。
    • bool QFile::exists():如果指定的文件存在返回true,否则返回false
    • QByteArray QIODevice::readAll():从设备读取所有剩余数据,并将其作为字节数组返回。
      • 此函数无法报告错误,返回空可能意味着当前没有可供读取的数据,或者发生了错误。
    • void QIODevice::close():文件内容读取结束后,需要调用该函数关闭文件。
//用IODevice方式保存文本文件
QFile file(QDir::currentPath() + "/file.txt");  
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
{
    return;
}
QString str = "Hello World";
QByteArray strBytes = str.toUtf8();  //转换为字节数组
file.write(strBytes, strBytes.length());  //写入文件
file.close();
  • toUtf8():函数将QString转换为UTF8编码的字节数组。

7.1.3 QFileQTextStream 结合读写文本文件

QTextStreamIO读写设备结合,为数据读写提供了一些方便方法的类。QTextStream可以与QFileQTemporaryFileQBufferQTcpSocketQUdpSocketIO设备类结合使用。

QFile file(fileName);QFile file(QDir::currentPath() + "/file.txt");  
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
{
    return;
}
QTextStream stream(&file);  //用文本流读取文件
stream.setAutoDetectUnicode(true);  //自动检测Unicode,才能显示汉字
QString stream.readAll();  //一次读取出文件全部文本内容
file.close();

在创建QTextStream实例时传递一个QFile对象,这样,QFile对象和QTextStream对象就结合在一起了,利用QTextStream可读写文件。如果文本文件里有汉字,需要设定为自动识别Unicode码,即调用setAutoDetectUnicode(true)函数。

下面方式适用于需要逐行解析字符串内容的应用:

QFile file(fileName);QFile file(QDir::currentPath() + "/file.txt");  
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
{
    return;
}
QTextStream stream(&file);  //用文本流读取文件
stream.setAutoDetectUnicode(true);  //自动检测Unicode,才能显示汉字
while (!stream.atEnd())
{
    QString str = stream.readLine();  读取文本的一行文本
    // ...
}
file.close();
  • QTextStream::readLine():函数通过自动识别换行符来读取一行字符串。
QFile file(fileName);QFile file(QDir::currentPath() + "/file.txt");  
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
{
    return;
}
QTextStream stream(&file);  //用文本流读取文件
stream.setAutoDetectUnicode(true);  //自动检测Unicode,才能显示汉字
stream << "Hello World";  //写入文本流
file.close();

因为使用了流的写入操作,所以使用QTextStream进行文件读写是比较方便的。

7.1.4 解决中文乱码问题

为了解决Unicode的识别问题,可以在应用程序中做全局的设置,使得应用程序支持Unicode。

方法是在main()函数中使用QTextCodec类进行编码设置:

int main()
{//解决汉字乱码问题
    QTextCodec* codec = QTextCodec::codecForName("UTF-8");
    QTextCodec::setCodecForLocale(codec);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值