目录
零. 前言
一.读取文件
二. 写入文件
三. 和二进制读写的区别
零. 前言
在 Qt 中,对文本文件进行读写操作是常见的任务之一。这对于保存和加载配置信息、处理数据文件等非常有用。
Qt 提供了多种方式来读写文本文件,使得文件操作变得相对简单和直观。
读取文本文件
可以使用
QFile
和QTextStream
类来读取文本文件的内容。首先,创建一个
QFile
对象并指定要读取的文件路径。然后,打开文件并检查是否成功打开。如果成功,创建一个QTextStream
对象与文件关联,然后通过QTextStream
来逐行或逐个字符地读取文件内容。
写入文本文件
类似地,创建
QFile
对象,指定写入的文件路径,打开文件(如果文件不存在,可能会创建新文件)。然后,创建QTextStream
对象与文件关联,通过QTextStream
向文件中写入文本内容。
在进行文件读写操作时,需要注意处理可能出现的错误情况,例如文件不存在、无法打开、写入失败等。
通过掌握 Qt 中的文本文件读写操作,能够有效地在应用程序中与外部文件进行数据交互,增强应用程序的功能和灵活性。
复制重新生成
一.读取文件
QFile
类是用于读取和写入文件的核心类之一。通过QFile
类,我们可以实现对文件的打开、读取数据、写入数据以及关闭等操作。
QFile
类的一些重要属性包括文件路径(通过构造函数或setFileName()
方法设置)和文件打开模式。
文件打开模式可以是以下枚举值之一:
QIODevice::NotOpen
:未打开。QIODevice::ReadOnly
:以只读方式打开。QIODevice::WriteOnly
:以只写方式打开。QIODevice::ReadWrite
:以读写方式打开。QIODevice::Append
:以追加的方式打开,新增加的内容将被追加到文件末尾。QIODevice::Truncate
:以重写的方式打开,在写入新的数据时会将原有数据全部清除,游标设置在文件开头。QIODevice::Text
:在读取时,将行结束符转换成\n
;在写入时,将行结束符转换成本地格式,例如在 Win32 平台上是\r\n
。QIODevice::Unbuffered
:忽略缓存。
方法:
open()
:用于打开文件。read()
/readLine()
/readAll()
:用于读取文件数据。readAll()
可以读取文件的全部内容;readLine()
用于逐行读取文件内容。write()
:用于向文件写入数据。close()
:关闭文件,释放相关资源。关闭文件很重要,因为它可以确保数据被正确写入磁盘,并释放文件描述符等相关资源。文件描述符表存在上限,如果一直打开文件而不关闭,可能会导致文件描述符表被占满,后续无法再打开新文件。
示例代码:
以下是一个简单的 Qt读取文件的示例代码,它打开一个文件并读取其内容显示在控制台:
#include <QCoreApplication>
#include <QFile>
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QString filePath = "E:\\QTCode\\One\\Two\\test\\test.txt"; // 替换为实际的文件路径QFile file(filePath);if (!file.open(QIODevice::ReadOnly | QIODevice::Text)){qDebug() << "Failed to open file";return -1;}QByteArray data = file.readAll();QString text = QString::fromUtf8(data);qDebug() << text;file.close();return a.exec();
}
在上述示例中,首先创建了一个QFile
对象并指定要打开的文件路径。然后使用open()
方法以只读和文本模式打开文件。如果打开成功,使用readAll()
方法读取文件的全部内容,并将其存储在QByteArray
中,再通过QString::fromUtf8()
将字节数组转换为QString
以便显示。最后,使用close()
方法关闭文件
效果图
二. 写入文件
在 Qt 中,写入文件是将数据保存到外部文件的操作。这使得程序能够持久化存储信息,以便在后续运行中使用或与其他程序共享数据。
属性:
与写入文件相关的属性通常包括文件路径(指定要写入的文件位置)和文件打开模式(如只写、读写、追加等)。
方法:
open()
:用于以指定的模式打开文件。write()
:将数据写入文件。flush()
:强制将缓冲区中的数据写入文件。close()
:关闭文件,确保数据完整写入并释放资源。
示例代码:
#include <QCoreApplication>
#include <QFile>
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QString filePath = "E:\\QTCode\\One\\Two\\test\\test.txt"; // 要写入的文件路径QFile file(filePath);if (!file.open(QIODevice::WriteOnly | QIODevice::Text)){qDebug() << "Failed to open file for writing";return -1;}QTextStream out(&file);out << "This is a line of text.\n";out << "This is another line.\n";file.close();return a.exec();
}
在上述示例中,首先指定了文件路径。然后创建 QFile
对象并以只写和文本模式打开文件。通过 QTextStream
对象将文本内容写入文件。最后关闭文件以确保数据被正确保存。
效果图
三. 和二进制读写的区别
二进制读写和文本文件读写的主要区别在于数据的表示和处理方式。
二进制读写是将数据以其二进制形式直接进行读取和写入,不进行任何额外的编码或转换。它可以处理各种类型的数据,包括图像、视频、音频等没有特定编码的二进制数据,也可以处理 C++基本类型(如 int、char、short 等)和复杂的数据类型(如自定义的类)。
在二进制读写中,数据的存储和读取是按照其原始的字节序列进行的。例如,写入一个整数时,就是将该整数的二进制位直接写入文件;读取时也会按照相同的字节顺序还原出原始的整数。
二进制读写的优点包括:
- 效率高,因为不需要进行编码和解码的转换过程。
- 能够准确地保存和恢复数据的原始形式,不会受到编码或文本格式的限制。
然而,二进制文件不是人可读的,直接查看二进制文件的内容通常是无意义的。
相比之下,文本文件读写是处理人可读的文本内容。在写入时,会根据特定的编码(如 ASCII、UTF-8 等)将字符转换为对应的二进制表示;读取时则进行相反的解码操作,将二进制数据转换为人类可理解的文本字符。
文本文件的优点是:
- 人可以直接打开并查看和理解文件的内容。
但文本文件读写也有一些限制:
- 对于非文本数据(如图像、音频等),如果强行以文本方式读写,可能会导致数据丢失或损坏。
- 由于需要进行编码和解码转换,可能会有一些性能开销。
例如,使用QDataStream
进行二进制读写时,它提供了基于QIODevice
的二进制数据序列化。可以方便地对文件、网络套接字等进行读写操作,并且可以存取 C++基本类型和复杂的数据类型。而使用QTextStream
操作文本文件时,它会自动将 Unicode 编码同操作系统的编码进行转换,也会处理换行符的转换。
在实际应用中,选择二进制读写还是文本文件读写取决于具体的需求。如果需要处理非文本数据、追求效率或需要精确保存数据的原始形式,通常会选择二进制读写;如果数据主要是人类可读的文本内容,并且希望人能够直接查看和编辑文件,那么文本文件读写更合适。