1.Qt中的IO操作的处理方式
- Qt通过统一的接口简化了文件与外部设备的操作方式
- Qt中的文件被看作一种特殊的外部设备
- Qt中的文件操作与外部设备的操作相同
2.IO操作中的关键函数接口
- 打开设备:bool open(OpenMode mode)
- 读取数据:QByteArray read(qint64 maxSize)
- 写入数据:qint64 write(const QByteArray& byteArray)
- 关闭设备:void close()
IO操作的本质:连续存储空间的数据读写
Qt中IO设备的类型
-
顺序存取设备:只能从头开始顺序的读写数据,不能指定数据的读写位置
-
随机存取设备:可以定位到任意的位置进行数据的读写
#include <QCoreApplication>
#include <QFile>
#include <QByteArray>
#include <QDebug>
#include <QFileInfo>
#include <QDateTime>void write(QString f)
{
QFile file(f);
//使用只写的方式打开文件,写入文本
if( file.open(QIODevice::WriteOnly | QIODevice::Text) )
{
file.write("Hello World\n");
file.write("QT Study");
file.close();
}
}
void read(QString f)
{
QFile file(f);
if( file.open(QIODevice::ReadOnly | QIODevice::Text ))
{
QByteArray ba1= file.read(4); //读取四个字符
QByteArray ba2 = file.readLine(); //一行一行读取
QString s1(ba1);
QString s2(ba2);
qDebug() << s1;
qDebug() << s2;
file.close();
}
}void info(QString f)
{
QFile file(f);
QFileInfo info(file);qDebug() << info.exists();// 判断文件是否存在 qDebug() << info.isFile(); //判断这个路径是不是文件,是文件返回true,目录返回false qDebug() << info.isReadable(); //判断是否有读取权限 qDebug() << info.isWritable(); //判断是否有写入权限 qDebug() << info.created(); //创建时间 qDebug() << info.lastRead(); //最后一次读取文件的时间 qDebug() << info.lastModified(); //最后一次修改的时间 qDebug() << info.path(); //文件的完整路径 qDebug() << info.fileName(); //文件名 qDebug() << info.suffix(); //文件后缀名 qDebug() << info.size(); //文件大小}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);//如果有这个文件,则写入,如果没有,则新建并写入 //write("C:/Users/聪/Desktop/新建 文本文档.txt"); read("C:/Users/聪/Desktop/新建 文本文档.txt"); info("C:/Users/聪/Desktop/新建 文本文档.txt"); return QCoreApplication::exec();}
3.Qt中的文件操作
Qt中提供了临时文件操作类(QTemporaryFile)
-
安全创建了一个全局唯一的临时文件
-
当对象销毁时对应的临时文件将被删除
-
临时文件的打开方式为QIODevice::ReadWrite
-
临时文件常用于大数据传递或者进程间通信的场合
#include <QCoreApplication>
#include <QTemporaryFile>
#include <QFileInfo>
#include <QDebug>int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);QTemporaryFile tempFile; //临时文件不需要文件名 if( tempFile.open() ) { tempFile.write("Hello World"); tempFile.close(); } QFileInfo info(tempFile); qDebug() << info.isFile(); qDebug() << info.path(); qDebug() << info.fileName(); return QCoreApplication::exec();}
运行结果:
true
"C:/Users/聪/AppData/Local/Temp"
"test15.hcMpOb"
4.Qt中的文件分为两大类
- 文本文件------文件内容时可读的文本字符
- 数据文件------文件内容是直接的二进制数据
如何将一个浮点数据写入文本文件和数据文件?
#include <QCoreApplication>
#include <QFile>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QFile file("C:/Users/聪/Desktop/test.hex");
if( file.open(QIODevice::WriteOnly) )
{
QString dt = "Hello World";
double value = 3.14;
file.write(dt.toStdString().c_str()); //QString类型不能直接写入文件,所以先转为C语言风格的字符串
//第一个参数必须是 *char 类型的指针(地址)
file.write(reinterpret_cast<char*>(&value), sizeof(value));//file.write() 不接收变量本身,只接收内存地址
file.close();
}
if( file. open(QIODevice::ReadOnly) )
{
QString dt = "";
double value = 0;
dt = QString(file.read(12));
file.read(reinterpret_cast<char*>(&value), sizeof(value));
file.close();
qDebug() << dt;
qDebug() <<value;
}
return QCoreApplication::exec();
}
5.Qt提供辅助类简化了文本文件/数据文件的读写
-
QTextStream------写入的数据全部转换为可读文本
-
QDataStream------写入的数据根据类型转化为二进制数据
#include <QCoreApplication>
#include <QFile>
#include <QTextStream>
#include <QDataStream>
#include <QDebug>void text_stream_test(QString f)
{
QFile file(f);
//写文件
if( file.open(QIODevice::WriteOnly | QIODevice::Text) )
{
QTextStream out(&file);// 像 cout 一样,直接输出各种数据 out << QString("Hello World") << endl; out << QString("Result: ") << endl; out << 5 << "*" << 6 << "=" << 5*6 <<endl; file.close(); } //读文件 if( file.open(QIODevice::ReadOnly | QIODevice::Text) ) { QTextStream in(&file); while( !in.atEnd() ) { QString line = in.readLine(); qDebug() << line; } file.close(); }}
void data_stream_test(QString f)
{
QFile file(f);
if( file.open(QIODevice::WriteOnly) )
{
QDataStream out(&file);out << QString("Hello World"); out << QString("Result: "); out << 3.14; file.close(); } if( file.open(QIODevice::ReadOnly) ) { QDataStream in(&file); QString dt = ""; QString result = ""; double value = 0; in >> dt; in >> result; in >> value; file.close(); qDebug() << dt; qDebug() << result; qDebug() << value; }}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
text_stream_test("C:/Users/聪/Desktop/新建 文本文档.txt");
data_stream_test("C:/Users/聪/Desktop/data.txt");return QCoreApplication::exec();}
运行结果:
"Hello World"
"Result: "
"5*6=30"
"Hello World"
"Result: "
3.14
6.数据流文件的版本信息
不同Qt版本的数据流文件格式可能不同
- out.setVersion(QDataStream::Qt_4_7); //写数据时指明当前版本号为4.7
- in.setVersion(QDataStream::Qt_4_7); //读数据时指明当前版本号为4.7