二十七、读写文件
27.1 文件类QFile
cpp
#include <QCoreApplication>
#include<QFile>
#include<QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QFile file("D:/main.txt");
if(!file.open(QIODevice::WriteOnly | QIODevice::Text))
qDebug()<<"打开文件失败";
else
qDebug()<<"打开文件成功";
file.write("Qt编程");
file.close();
if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
qDebug()<<"打开文件失败";
else
qDebug()<<"打开文件成功";
char *str=new char[200];
qint64 count=file.readLine(str,200);
while((count!=0) && (count!=-1))
{
qDebug()<<str;
count=file.readLine(str,200);
}
file.close();
return a.exec();
}
这段代码是一个简单的文件读写示例,主要包括以下几个步骤:
-
创建一个QFile对象,指定文件路径为D:/main.txt。
-
以只写和文本模式打开文件,如果打开失败则输出"打开文件失败",否则输出"打开文件成功"。
-
向文件中写入字符串"Qt编程"。
-
关闭文件。
-
以只读和文本模式打开文件,如果打开失败则输出"打开文件失败",否则输出"打开文件成功"。
-
创建一个长度为200的字符数组,使用file.readLine()方法读取文件中的一行数据,将数据存储到字符数组中,并返回读取的字节数。
-
循环读取文件中的每一行数据,直到读取到文件末尾或者读取失败。
-
输出读取到的每一行数据。
-
关闭文件。
qint64 QIODevice::readLine(char *data, qint64 maxSize):
该函数从设备读取一行ASCII字符(最大maxSize - 1字节),将字符存储在data中,并返回读取的字节数。如果一行无法读取但没有发生错误,则此函数返回0。如果发生错误,此函数返回可读取内容的长度,如果没有读取,则返回-1。
结束的'\0'字节总是附加到data后,因此maxSize必须大于1。
一直读取数据,直到满足以下条件之一:
读取第一个'\n'字符。
maxSize -读取1个字节。
设备数据结束检测
27.2 读写二进制文件QDataStream和QTextStream
cpp
#include <QCoreApplication>
#include<QFile>
#include<QDebug>
#include<QTextStream>
#include<QDataStream>
#include<QString>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QFile file("D:/main.txt");
if(!file.open(QIODevice::WriteOnly | QIODevice::Text))
qDebug()<<"打开文件失败";
else
qDebug()<<"打开文件成功";
QTextStream textStreamWrite(&file);
textStreamWrite<<(QString)"Qt开发编程";
file.close();
if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
qDebug()<<"打开失败";
else
qDebug()<<"打开成功";
QTextStream textStreamRead(&file);
while(!textStreamRead.atEnd())
{
QString str;
textStreamRead>>str;
qDebug()<<str;
}
file.close();
return a.exec();
}
这段代码主要是演示了如何使用Qt库中的QFile、QTextStream和QDataStream类来读写文件。具体来说,代码首先创建一个名为main.txt的文件,并向其中写入一行文本"Qt开发编程",然后再次打开该文件并读取其中的文本内容,并将其输出到控制台。代码中使用了QTextStream类来进行文本的读写操作,同时使用了QIODevice::ReadOnly和QIODevice::WriteOnly来指定文件的打开模式。
bool QTextStream::atEnd() const:
如果没有更多的数据要从QTextStream中读取,则返回true;否则返回false。这与调用QIODevice::atEnd()类似,但不相同,因为QTextStream也会考虑其内部Unicode缓冲区。