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
#include
#include
#include
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
#include
#include
#include
#include
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常用静态函数: