ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Qt 文件操作详解:从基础类到读写实战

Qt 文件操作详解:从基础类到读写实战 目录 1. 引言 2. 输入输出设备类✏️ 3. 文件读写类 4. 示例1读取文件内容 5. 示例2写文件 6. 文件和目录信息类☁️ 7. 总结 8. 经典面试题 1. 引言文件操作是应用程序必不可少的部分。Qt 作为一个通用开发库提供了跨平台的文件操作能力。Qt 提供了很多关于文件的类通过这些类能够对文件系统进行操作如文件读写、文件信息获取、文件复制或重命名等。本文将系统介绍 Qt 中文件操作相关的核心类、继承关系以及实际应用示例。 2. 输入输出设备类在 Qt 中文件读写的类为QFile。QFile的父类为QFileDeviceQFileDevice提供了文件交互操作的底层功能。QFileDevice的父类是QIODeviceQIODevice的父类为QObject。QIODevice是 Qt 中所有输入输出设备input/output device简称 I/O 设备的基础类。I/O 设备就是能进行数据输入和输出的设备例如文件是一种 I/O 设备网络通信中的 socket 是 I/O 设备串口、蓝牙等通信接口也是 I/O 设备所以它们也是从QIODevice继承来的。Qt 中主要的一些 I/O 设备类的继承关系如下图所示上图中各类的说明如下QFile用于文件操作和文件数据读写的类使用QFile可以读写任意格式的文件。QSaveFile用于安全保存文件的类。使用QSaveFile保存文件时它会先把数据写入一个临时文件成功提交后才将数据写入最终的文件。如果保存过程中出现错误临时文件里的数据不会被写入最终文件这样就能确保最终文件中不会丢失数据或被写入部分数据。在保存比较大的文件或复杂格式的文件时可以使用这个类例如从网络上下载文件等。QTemporaryFile用于创建临时文件的类。使用函数QTemporaryFile::open()就能创建一个文件名唯一的临时文件在QTemporaryFile对象被删除时临时文件被自动删除。QTcpSocket 和 QUdpSocket分别实现了 TCP 和 UDP 的类。QSerialPort实现了串口通信的类通过这个类可以实现计算机与串口设备的通信。串口是比较古老的通信方式一般在嵌入式系统上面开发板通过串口和开发板之间进行交互。QBluetoothSocket用于蓝牙通信的类。手机和平板计算机等移动设备有蓝牙通信模块笔记本电脑一般也有蓝牙通信模块。通过QBluetoothSocket类就可以编写蓝牙通信程序如编程实现笔记本电脑与手机的蓝牙通信。QProcess用于启动外部程序并且可以给程序传递参数。相当于对fork()和exec操作进行封装。QBuffer以一个QByteArray对象作为数据缓冲区将QByteArray对象当作一个 I/O 设备来读写。✏️ 3. 文件读写类在 Qt 中文件的读写主要是通过QFile类来实现。在QFile类中提供了一些用来读写文件的方法。对于文件的操作主要有读数据QFile类中提供了多个方法用于读取文件内容如read()、readAll()、readLine()等。写数据QFile类中提供了多个方法用于往文件中写内容如write()、writeData()等。关闭文件文件使用结束后必须用函数close()关闭文件。访问一个设备之前需要使用open()函数打开该设备而且必须指定正确的打开模式。QIODevice中所有的打开模式由QIODevice::OpenMode枚举变量定义其取值如下打开模式说明QIODevice::NotOpen没有打开设备QIODevice::ReadOnly以只读方式打开设备QIODevice::WriteOnly以只写方式打开设备QIODevice::ReadWrite以读写方式打开设备QIODevice::Append以追加方式打开设备数据将写到文件末尾QIODevice::Truncate每次打开文件后重写文件内容原内容将被删除QIODevice::Text在读文件时行尾终止符会被转换为\n当写入文件时行尾终止符会被转换为本地编码。如 Win32 上为\r\nQIODevice::Unbuffered无缓冲形式打开文件绕过设备中的任何缓冲区QIODevice::NewOnly文件存在则打开失败不存在则创建文件 4. 示例1读取文件内容新建 Qt 项目在 UI 文件中拖入一个LineEdit一个pushButton一个TextEdit。当点击按钮时弹出窗口选择要读取的文件并将读取到的内容在TextEdit中显示在 “widget.cpp” 文件中实现对应功能#includewidget.h#includeui_widget.h#includeQFileDialogWidget::Widget(QWidget*parent):QWidget(parent),ui(newUi::Widget){ui-setupUi(this);connect(ui-pushButton,QPushButton::clicked,[](){QString pathQFileDialog::getOpenFileName(this,//对话框的父类打开文件,//对话框的标题D:\\Qt\\tmp//默认打开文件路径);//将打开的文件路径放到lineEdit中ui-lineEdit-setText(path);//path 代表的是打开的文件的路径QFilefile(path);file.open(QIODevice::ReadOnly);//表示以只读的方式打开文件QString strfile.readAll();//读取文件中的所有内容一次读全部//将读取到的文件内容放到textEdit中ui-textEdit-setText(str);//记得用完要关闭文件file.close();});}Widget::~Widget(){deleteui;}实现效果如下 5. 示例2写文件在上述示例的基础上修改 “widget.cpp” 文件#includewidget.h#includeui_widget.h#includeQFileDialogWidget::Widget(QWidget*parent):QWidget(parent),ui(newUi::Widget){ui-setupUi(this);connect(ui-pushButton,QPushButton::clicked,[](){QString pathQFileDialog::getOpenFileName(this,//对话框的父类打开文件,//对话框的标题D:\\Qt\\tmp//默认打开文件路径);//将打开的文件路径放到lineEdit中ui-lineEdit-setText(path);//path 代表的是打开的文件的路径QFilefile(path);file.open(QIODevice::Append);//表示以追加的方式打开文件//写入文件file.write(【这是一个使用Qt写文件的案例】);file.close();});}Widget::~Widget(){deleteui;}实现效果如下 6. 文件和目录信息类QFileInfo是 Qt 提供的一个用于获取文件和目录信息的类如获取文件名、文件大小、文件修改日期等。QFileInfo类中提供了很多的方法常用的有isDir()检查该文件是否是目录isExecutable()检查该文件是否是可执行文件fileName()获得文件名completeBaseName()获取完整的文件名suffix()获取文件后缀名completeSuffix()获取完整的文件后缀size()获取文件大小isFile()判断是否为文件fileTime()获取文件创建时间、修改时间、最近访问时间等示例在 “widget.cpp” 文件中添加如下代码#includewidget.h#includeui_widget.h#includeQDebug#includeQDateTime#includeQPushButton#includeQFileDialog#includeQFileInfo#includeQFileDeviceWidget::Widget(QWidget*parent):QWidget(parent),ui(newUi::Widget){ui-setupUi(this);connect(ui-btn,QPushButton::clicked,[](){QString pathQFileDialog::getOpenFileName(this,打开文件,D:\\Qt\\tmp);//创建一个获取文件信息的QFileInfo对象QFileInfofileInfo(path);//1.获取文件名qDebug()文件名fileInfo.fileName().toUtf8().data();//2.文件后缀名qDebug()当前文件的后缀名是fileInfo.suffix().toUtf8().data();//3.文件大小qDebug()文件大小是fileInfo.size();//5.文件路径qDebug()文件路径fileInfo.path().toUtf8().data();//6.是否是文件qDebug()是否是文件fileInfo.isFile();//7.是否是目录qDebug()是否是目录fileInfo.isDir();//8.文件创建时间QDateTime creaate_timefileInfo.fileTime(QFileDevice::FileBirthTime);qDebug()创建时间为creaate_time.toString(yyyy-MM-dd hh:mm::ss).toUtf8().data();//9.文件的修改时间QDateTime modify_timefileInfo.lastModified();qDebug()文件最后的修改时间modify_time.toString(yyyy-MM-dd hh:mm:ss);});}Widget::~Widget(){deleteui;}实现效果如下☁️7. 总结本文详细介绍了 Qt 中文件操作的核心知识包括QIODevice及其子类的继承体系、QFile的读写方法、打开模式枚举以及QFileInfo获取文件信息的方法。通过读取文件、写入文件和获取文件信息三个实战示例相信读者已经掌握了 Qt 文件操作的基本流程。在实际开发中根据需求选择合适的类和方法就能高效地完成文件相关的功能。8. 经典面试题面试题1QFile 与 QSaveFile 有什么区别分别在什么场景下使用参考答案QFile是 Qt 中最基础的文件读写类直接对文件进行读写操作适用于大多数普通文件读写场景。而QSaveFile是用于安全保存文件的类它先把数据写入一个临时文件成功提交后才将数据写入最终文件。如果保存过程中出现错误临时文件里的数据不会被写入最终文件从而确保最终文件不会丢失数据或被写入部分数据。适用场景当需要写入大量数据或写入过程中一旦出错会导致原文件损坏时应优先使用QSaveFile。例如从网络上下载文件、保存配置文件等场景。而普通的小文件读写使用QFile即可。面试题2QIODevice::OpenMode 中 Append 和 Truncate 有什么区别参考答案QIODevice::Append以追加方式打开设备数据将写到文件末尾原有内容保留。QIODevice::Truncate每次打开文件后重写文件内容原内容将被删除。注意两者不能同时使用。如果以Append方式打开写入的数据会追加到文件末尾如果以Truncate方式打开文件原有内容会被清空再写入新数据。面试题3QFile 读取文件时read()、readAll()、readLine() 有什么区别参考答案read(qint64 maxSize)从文件中读取最多maxSize字节的数据适合分块读取大文件避免一次性加载过多内容导致内存占用过高。readAll()一次性读取文件中的所有内容返回一个QByteArray。适合读取小文件简单方便。readLine()读取一行数据以换行符为分隔。适合逐行处理文本文件如日志文件、配置文件等。实际建议对于大文件应使用read()分块读取对于小文件可以直接使用readAll()对于文本文件需要逐行处理时使用readLine()更高效。面试题4QFileInfo 中 fileName()、completeBaseName()、suffix()、completeSuffix() 有什么区别参考答案假设文件路径为C:\Users\Lenovo\Desktop\example.tar.gzfileName()返回文件名包含所有后缀结果为example.tar.gz。completeBaseName()返回完整的文件名不含后缀结果为example.tar。suffix()返回最后一个后缀名结果为gz。completeSuffix()返回完整的后缀名结果为tar.gz。记忆技巧带complete前缀的方法返回更完整的信息completeBaseName()返回去掉最后一个后缀的文件名completeSuffix()返回所有后缀。面试题5使用 QFile 读写文件时为什么一定要调用 close()如果不调用会怎样参考答案close()用于关闭文件释放文件句柄。如果不调用close()文件句柄会一直占用可能导致以下问题资源泄漏文件句柄是系统资源不释放会导致资源耗尽尤其是在循环中反复打开文件时。数据丢失写入的数据可能还停留在缓冲区中没有真正写入磁盘关闭文件时才会刷新缓冲区。文件被占用文件一直被占用其他程序无法访问或删除该文件。注意在 Qt 中QFile对象被销毁时析构函数会自动调用close()但为了代码清晰和及时释放资源建议在文件使用完毕后显式调用close()。面试题6QTemporaryFile 有什么特点它的临时文件什么时候会被删除参考答案QTemporaryFile是用于创建临时文件的类。使用QTemporaryFile::open()就能创建一个文件名唯一的临时文件避免文件名冲突。它的特点是文件名唯一不会与其他文件冲突。当QTemporaryFile对象被销毁时临时文件会被自动删除无需手动清理。适用场景程序运行过程中需要临时存储数据且不需要长期保留的场景例如缓存数据、中间结果等。
返回列表