赞
踩
QIODevice
是Qt中所有设备的基接口类,具体IO设备如QFile
、QTcpSocket
等类继承QIODevice提供的抽象接口。
QIODevice
是抽象类,不能被实例化。
和C库、Linux下的文件操作等很类似,QIODevice
也都提供了open()、read、write()、close()等函数
QIODevice
设备打开模式右QIODevice::OpenMode
枚举定义
Constant | Value | Description |
---|---|---|
QIODevice::NotOpen | 0x0000 | 设备没有打开 |
QIODevice::ReadOnly | 0x0001 | 只读方式打开,无法写入 |
QIODevice::WriteOnly | 0x0002 | 只写方式打开,无法读取 |
QIODevice::ReadWrite | ReadOnly | WriteOnly |
QIODevice::Append | 0x0004 | 附加模式打开,所有数据写到文件尾 |
QIODevice::Truncate | 0x0008 | 如果可能,设备在被打开之前被截断。设备的所有早期内容都消失 |
QIODevice::Text | 0x0010 | 读取时,行结束符被转换为’\n’。在编写时,行结束符被转换为本地编码,例如Win32中的’\r\n’ |
QIODevice::Unbuffered | 0x0020 | 绕过设备的所有缓冲区 |
QIODevice
会区别两种设备: 随机存储设备
和顺序存储设备
随机存储设备
支持使用seek()函数定位到任意位置以及使用pos()
函数获取位置。QFile、QBuffer属于这样的设备
顺序存储设备
不支持定位到任意位置,数据必须一次性读取。QTcpSocket、QProcess属于顺序存储设备
文件的数据读写一般使用QDataStream
或QTextStream
来完成
bool QFile::exists() const
[static] bool QFile::exists(const QString &fileName)
//成功 true
//失败 false
//通过文件句柄打开文件
bool QFile::open(FILE *fh, OpenMode mode, FileHandleFlags handleFlags = DontCloseHandle)
//通过文件描述符打开文件
bool QFile::open(int fd, OpenMode mode, FileHandleFlags handleFlags = DontCloseHandle)
//继承自其父类QIODevice的打开方法
OpenMode openMode() const
bool QFile::remove()
//删除名为fileName的文件
[static] bool QFile::remove(const QString &fileName)
bool QFile::rename(const QString &newName)
[static] bool QFile::rename(const QString &oldName, const QString &newName)
void QFile::setFileName(const QString &name)
QFile file;
file.setFileName("readme.txt");
bool putChar(char c) //继承自父类QIODevice
写一堆数据
都是继承自父类QIODevice
qint64 write(const char *data, qint64 maxSize)
qint64 write(const char *data)
qint64 write(const QByteArray &byteArray)
读数据
都是继承自父类QIODevice
qint64 read(char *data, qint64 maxSize)
QByteArray read(qint64 maxSize)
qint64 readLine(char *data, qint64 maxSize)
QByteArray readLine(qint64 maxSize = 0)
QByteArray readAll()
void close()
QString errorString() const
bool atEnd() const
qint64 size() const
qint64 pos() const
virtual bool seek(qint64 pos)
相关类: QFileInfo
#include "mywidget.h" #include "ui_mywidget.h" #include <QFile> #include <QDebug> #include <QFileInfo> #include <QDateTime> MyWidget::MyWidget(QWidget *parent) : QWidget(parent), ui(new Ui::MyWidget) { ui->setupUi(this); QFile file("readme.txt"); //打开文件,文件不存在会创建文件 if (!file.open(QIODevice::WriteOnly | QIODevice::Text)){ qDebug() << file.errorString(); } qint64 writeSize = file.write("hello! Qt"); if (writeSize < 0){ qDebug() << file.errorString(); }else{ qDebug() << "write bytes :" << writeSize; } if (file.atEnd()){ file.seek(0); //设置到开头 } writeSize = file.write("Qt Creator,"); if (writeSize < 0){ qDebug() << file.errorString(); }else{ qDebug() << "write bytes :" << writeSize; } file.close(); //关闭文件 QFileInfo fileInfo(file); //类似Linux下的函数fstat可以获取文件信息 qDebug() << "包含文件名的文件绝对路径 :" << fileInfo.absoluteFilePath(); qDebug() << "不包含文件名的文件绝对路径 :" << fileInfo.absolutePath(); qDebug() << "文件基本名称 :" << fileInfo.baseName(); qDebug() << "文件名 :" << fileInfo.fileName(); qDebug() << "创建时间 :" << fileInfo.created(); qDebug() << "文件大小 :" << fileInfo.size(); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)){ qDebug() << file.errorString(); } file.seek(2); QByteArray readArray = file.readAll(); qDebug() << readArray.data(); if (file.atEnd()){ file.seek(0); //设置到开头 } readArray = file.readAll(); qDebug() << readArray.data(); file.close(); } MyWidget::~MyWidget() { delete ui; }
QTextStream
可以操作QIODevice
、QByteArray或QString。使用QTextStream
重载的流操作符<<和
>>`,可以方便地读取和写入单词、行和数字。
对文本操作,QTextStream
支持字段填充
和对齐
的格式化选项,以及数字的格式化。
#include "mywidget.h" #include "ui_mywidget.h" #include <QFile> #include <QDebug> #include <QFileInfo> #include <QDateTime> #include <QTextStream> MyWidget::MyWidget(QWidget *parent) : QWidget(parent), ui(new Ui::MyWidget) { ui->setupUi(this); QFile file("readme.txt"); QTextStream *fileStream = new QTextStream(&file); fileStream->setFieldWidth(10); //打开文件,文件不存在会创建文件 if (!file.open(QIODevice::WriteOnly)){ qDebug() << file.errorString(); } *fileStream << "Result: " << qSetFieldWidth(20) << center << 3.14 << 2.7 << "\r\n"; *fileStream << qSetFieldWidth(10) << left << 10 << 50; //qSetFieldWidth(20)设置后面输入数据之间的间隔 //center:设置为中间对齐方式,left-左对齐,right-右对齐 file.close(); if (!file.open(QIODevice::ReadOnly)) { qDebug() << file.errorString(); } QString str; QArrayData arr; QString strAll; QString strLine; strLine = fileStream->readLine(); //读取一行 qDebug() << strLine; fileStream->seek(0); strAll = fileStream->readAll(); //读取全部 qDebug() << strAll; fileStream->seek(0); //定位读位置到开头 *fileStream >> str; //读取Result: qDebug() << str; *fileStream >> str; //读取3.14 qDebug() << str; *fileStream >> str; //读取2.7 qDebug() << str; file.close(); } MyWidget::~MyWidget() { delete ui; }
数据流QDataStream
的使用和文本流QTextStream
差不多。
目录操作相关的类:QDir
QDir常用静态函数:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。