7.1 文本文件读写
7.1.1 实例功能概述
Qt提供了两种读写纯文本文件的基础方法:
QFile
类的IODevice
读写功能直接进行读写;- 利用
QFile
和QTextStream
结合,用流(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 QFile
和 QTextStream
结合读写文本文件
QTextStream
与IO
读写设备结合,为数据读写提供了一些方便方法的类。QTextStream
可以与QFile
、QTemporaryFile
、QBuffer
、QTcpSocket
和QUdpSocket
等IO
设备类结合使用。
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);
}