<QFile>
头文件。创建 QFile 类的对象,常用的构造函数有:
QFile::QFile() QFile::QFile(const QString &name)参数 name 用来指定要操作的目标文件,包含文件的存储路径和文件名,存储路径可以使用绝对路径(比如 "D:/Demo/test.txt")或者相对路径(比如"./Demo/test.txt"),路径中的分隔符要用 "/" 表示。
bool QFile::open(OpenMode mode)mode 参数用来指定文件的打开方式,下表罗列了此参数的可选值以及各自的含义:
打开方式 | 含 义 |
---|---|
QIODevice::ReadOnly | 只能对文件进行读操作 |
QIODevice::WriteOnly | 只能对文件进行写操作,如果目标文件不存在,会自行创建一个新文件。 |
QIODevice::ReadWrite | 等价于 ReadOnly | WriteOnly,能对文件进行读和写操作。 |
QIODevice::Append | 以追加模式打开文件,写入的数据会追加到文件的末尾(文件原有的内容保留)。 |
QIODevice::Truncate | 以重写模式打开,写入的数据会将原有数据全部清除。注意,此打开方式不能单独使用,通常会和 ReadOnly 或 WriteOnly 搭配。 |
QIODevice::Text | 读取文件时,会将行尾结束符(Unix 系统中是 "\n",Windows 系统中是 "\r\n")转换成‘\n’;将数据写入文件时,会将行尾结束符转换成本地格式,例如 Win32 平台上是‘\r\n’。 |
|
分割。比如:
普通成员方法 | 功 能 |
---|---|
qint64 QFile::size() const | 获取当前文件的大小。对于打开的文件,该方法返回文件中可以读取的字节数。 |
bool QIODevice::getChar(char *c) | 从文件中读取一个字符,并存储到 c 中。读取成功时,方法返回 true,否则返回 false。 |
bool QIODevice::putChar(char c) | 向文件中写入字符 c,成功时返回 true,否则返回 false。 |
QByteArray QIODevice::read(qint64 maxSize) | 从文件中一次性最多读取 maxSize 个字节,然后返回读取到的字节。 |
qint64 QIODevice::read(char *data, qint64 maxSize) | 从文件中一次性对多读取 maxSize 个字节,读取到的字节存储到 data 指针指定的内存控件中。该方法返回成功读取到的字节数。 |
QByteArray QIODevice::readAll() | 读取文件中所有的数据。 |
qint64 QIODevice::readLine(char *data, qint64 maxSize) | 每次从文件中读取一行数据或者读取最多 maxSize-1 个字节,存储到 data 中。该方法返回实际读取到的字节数。 |
qint64 QIODevice::write(const char *data, qint64 maxSize) | 向 data 数据一次性最多写入 maxSize 个字节,该方法返回实际写入的字节数。 |
qint64 QIODevice::write(const char *data) | 将 data 数据写入文件,该方法返回实际写入的字节数。 |
qint64 QIODevice::write(const QByteArray &byteArray) | 将 byteArray 数组中存储的字节写入文件,返回实际写入的字节数。 |
bool QFile::copy(const QString &newName) |
将当前文件的内容拷贝到名为 newName 的文件中,如果成功,方法返回 true,否则返回 false。 copy 方法在执行复制操作之前,会关闭源文件。 |
bool QFile::rename(const QString &newName) | 对当前文件进行重命名,新名称为 newName,成功返回 true,失败返回 false。 |
bool QFile::remove() | 删除当前文件,成功返回 true,失败返回 false。 |
#include <QFile> #include <QDebug> int main(int argc, char *argv[]) { //创建 QFile 对象,同时指定要操作的文件 QFile file("D:/demo.txt"); //对文件进行写操作 if(!file.open(QIODevice::WriteOnly|QIODevice::Text)){ qDebug()<<"文件打开失败"; } //向文件中写入两行字符串 file.write("C语言中文网\n"); file.write("http://task.lmcjl.com"); //关闭文件 file.close(); //重新打开文件,对文件进行读操作 if(!file.open(QIODevice::ReadOnly|QIODevice::Text)){ qDebug()<<"文件打开失败"; } //每次都去文件中的一行,然后输出读取到的字符串 char * str = new char[100]; qint64 readNum = file.readLine(str,100); //当读取出现错误(返回 -1)或者读取到的字符数为 0 时,结束读取 while((readNum !=0) && (readNum != -1)){ qDebug() << str; readNum = file.readLine(str,100); } file.close(); return 0; }执行程序,"C语言中文网" 和 "http://task.lmcjl.com" 先写入 D 盘的 demo.txt 文件,然后再从文件中将它们读取出来。
#include <QFile> #include <QDebug> int main(int argc, char *argv[]) { //指定要写入文件的数据 qint32 nums[5]={1,2,3,4,5}; //写入文件之前,要将数据以二进制方式存储到字节数组中 QByteArray byteArr; byteArr.resize(sizeof(nums)); for(int i=0;i<5;i++){ //借助指针,将每个整数拷贝到字节数组中 memcpy(byteArr.data()+i*sizeof(qint32),&(nums[i]),sizeof(qint32)); } //将 byteArr 字节数组存储到文件中 QFile file("D:/demo.dat"); file.open(QIODevice::WriteOnly); file.write(byteArr); file.close(); //再次打开文件,读取文件中存储的二进制数据 file.open(QIODevice::ReadOnly); QByteArray resArr = file.readAll(); //输出读取到的二进制数据 qDebug()<<"resArr: "<<resArr; //将二进制数据转化为整数 char* data = resArr.data(); while(*data){ qDebug() << *(qint32*)data; data += sizeof(qint32); } return 0; }执行程序,demo.dat 文件中会存储 {1,2,3,4,5} 这 5 个整数的二进制形式,同时输出以下内容:
resArr: "\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00"
1
2
3
4
5
<QTextStream>
头文件。QTextStream 类提供了很多种构造函数,常用的是:
QTextStream(QIODevice *device)QIODevice 是 QFile 的父类,因此在构造 QTextStream 类的对象时,需要传递一个 QFile 类的对象。
成员方法 | 功 能 |
---|---|
bool QTextStream::atEnd() const | 判断是否读到文件末尾,如果已经达到末尾,返回 true,否则返回 false。 |
QString QTextStream::read(qint64 maxlen) | 从文件中读最多 maxlen 个字符,返回这些字符组成的 QString 字符串。 |
QString QTextStream::readAll() | 从文件中读取所有内容,返回由读取内容组成的 QString 字符串。 |
QString QTextStream::readLine(qint64 maxlen = 0) | 默认读取一行文本,如果手动指定 maxlen 的值,则最多读取 maxlen 个字符,并返回读取内容组成的 QString 字符串。 |
void QTextStream::setFieldAlignment(FieldAlignment mode) | 设置对齐方式,通常与 setFieldWidth() 一起使用。 |
void QTextStream::setFieldWidth(int width) | 设置每份数据占用的位置宽度为 width。 |
>>
输入运算符和>>
输出运算符,使读写文本文件变得更简单。例如,用 QTextStream 实现【实例一】的程序如下:#include <QFile> #include <QDebug> #include <QString> #include <QTextStream> int main(int argc, char *argv[]) { //创建 QFile 对象,同时指定要操作的文件 QFile file("D:/demo.txt"); //对文件进行写操作 if(!file.open(QIODevice::WriteOnly|QIODevice::Text)){ qDebug()<<"文件打开失败"; } QTextStream out(&file); //向文件中写入两行字符串 out << (QString)"C语言中文网\n" << (QString)"http://task.lmcjl.com"; //关闭文件 file.close(); //重新打开文件,对文件进行读操作 if(!file.open(QIODevice::ReadOnly|QIODevice::Text)){ qDebug()<<"文件打开失败"; } QTextStream in(&file); //一直读,直至读取失败 while(!in.atEnd()){ QString str; //从文件中读取一个字符串 in >> str; qDebug() << str; } file.close(); return 0; }
<iostream>
类似,QTextStream 类提供了两种格式化输出的方法,一种是调用该类的成员方法,例如表 3 中的 setFieldAlignment()、setFieldWidth 等,另一种是调用 QTextStream 类提供的格式描述符,下表罗列了常用的一些:描述符 | 功能相同的方法 | 功 能 |
---|---|---|
Qt::hex | QTextStream::setIntegerBase(16) | 将指定整数对应的 16 进制数写入到文件中。 |
Qt::showbase | QTextStream::setNumberFlags(numberFlags() | ShowBase) | 对于非十进制数,写入到文件中时带上相应的前缀。二进制数前缀是 0b,八进制数前缀是 0,十六进制数前缀是 0x。 |
Qt::forcesign | QTextStream::setNumberFlags(numberFlags() | ForceSign) | 将数字写入文件时,带上正负号。 |
Qt::fixed | QTextStream::setRealNumberNotation(FixedNotation) | 将浮点数以普通小数的形式写入文件。 |
Qt::scientific | QTextStream::setRealNumberNotation(ScientificNotation) | 将浮点数以科学计数法的形式写入文件。 |
Qt::left | QTextStream::setFieldAlignment(AlignLeft) | 左对齐 |
Qt::right | QTextStream::setFieldAlignment(AlignRight) | 右对齐 |
Qt::center | QTextStream::setFieldAlignment(AlignCenter) | 居中对齐 |
#include <QFile> #include <QDebug> #include <QString> #include <QTextStream> int main(int argc, char *argv[]) { QFile file("D:/demo.txt"); if(!file.open(QIODevice::WriteOnly|QIODevice::Text)){ qDebug()<<"文件打开失败"; } QTextStream out(&file); //将 10 的十六进制数写入文件 out << hex << 10; //设置每份数据占用 10 个字符的位置 out.setFieldWidth(10); //以右对齐的方式写入 3.14 out << left << 3.14; //后续数据以左对齐的方式写入文件 out.setFieldAlignment(QTextStream::AlignRight); out << 2.7; //关闭文件 file.close(); return 0; }程序运行后,demo.txt 存储的文本内容为:
a3.14 2.7
<QDataStream>
头文件。创建 QDataStream 对象常用的构造函数为:
QDataStream::QDataStream(QIODevice *d)下表罗列了 QDataStream 类常用的成员方法:
成员方法 | 功 能 |
---|---|
bool QDataStream::atEnd() const | 判断是否读到文件末尾,如果已经达到末尾,返回 true,否则返回 false。 |
QDataStream &QDataStream::readBytes(char *&s, uint &l) | 对于用 writeBytes() 方法写入文件的 l 和 s,只能使用 readBytes() 方法读取出来。 |
int QDataStream::readRawData(char *s, int len) | 从文件中读取最多 len 字节的数据到 s 中,返回值表示实际读取的字节数。注意,调用该方法之前,需要先给 s 参数分配好内存空间。 |
void QDataStream::setVersion(int v) | 不同版本的 Qt 中,同名称的数据类型也可能存在差异,通过调用此方法手动指定版本号,可以确保读取数据的一致性。 |
int QDataStream::skipRawData(int len) | 跳过文件中的 len 个字节,返回实际跳过的字节数。 |
QDataStream &QDataStream::writeBytes(const char *s, uint len) | 将长度 len 和 s 一起写入到文件中,对于 writeBytes() 写入的数据,只能用 readBytes() 方法读取。 |
int QDataStream::writeRawData(const char *s, int len) | 将 s 中前 len 字节的数据写入文件,返回值表示成功写入的字节数。 |
<<
和>>
进行了重载,举个简单的例子,用 QDataStream 重新实现实例二:
#include <QFile> #include <QDebug> #include <QDataStream> int main(int argc, char *argv[]) { //指定要写入文件的数据 qint32 nums[5]={1,2,3,4,5}; QFile file("D:/demo.dat"); file.open(QIODevice::WriteOnly); //创建 QDataStream 对象 QDataStream out(&file); //将 nums 数组中的整数逐个写入到二进制文件中 for(int i=0;i<5;i++){ out << nums[i]; } file.close(); //再次打开文件,读取文件中存储的二进制数据 file.open(QIODevice::ReadOnly); QDataStream in(&file); //读取二进制文件中的数据 while(!in.atEnd()){ //每次读取一个整数 qint32 num; in >> num; qDebug() << num; } return 0; }输出结果为:
1
2
3
4
5
本文链接:http://task.lmcjl.com/news/18428.html