文件和数据流函数
QIODevice 类是所有 I/O 设备的基接口类 Qt CoreQIODevice 既为支持数据块读写的设备提供了通用实现,也提供了抽象接口。该设备可以是内存缓冲区、文件或数据流。
某些子类(如 `QFile `)采用内存缓冲区来临时存储数据。这通过减少读写操作来加快程序运行速度。缓冲机制使得 `getChar()` 和 `putChar()` 等函数运行迅速,因为它们可以对内存缓冲区进行操作,而非直接对设备本身进行操作。
QFile 类提供了用于读写文件的函数。QFile 既可以单独使用,也可以更方便地与QTextStream 或QDataStream 配合使用。
QBuffer 允许您通过 `QIODevice ` 接口访问 `QByteArray `。`QByteArray ` 被视为标准的随机访问文件。示例如下:
QBuffer buffer;
char ch;
buffer.open(QBuffer::ReadWrite);
buffer.write("Qt rocks!");
buffer.seek(0);
buffer.getChar(&ch); // ch == 'Q'
buffer.getChar(&ch); // ch == 't'
buffer.getChar(&ch); // ch == ' '
buffer.getChar(&ch); // ch == 'r'调用 `open()` 打开缓冲区。然后调用 `write()` 或 `putChar()` 向缓冲区写入数据,并调用 `read()`、`readLine()`、`readAll()` 或 `getChar()` 从缓冲区读取数据。`size()` 返回缓冲区的当前大小,您可以通过调用 `seek()` 在缓冲区中定位到任意位置。 当您完成对缓冲区的访问后,请调用close()。
QDataStream 类提供将二进制数据序列化为QIODevice 的功能。数据流是一种编码信息的二进制流,它完全独立于主机计算机的操作系统、CPU或字节序。例如,由运行Windows的PC写入的数据流,可以被运行Solaris的Sun SPARC读取。 您还可以使用数据流来读写未经编码的原始二进制数据。
有关QDataStream 可序列化的数据类型的更多详细信息,请参阅《Qt数据类型的序列化》。
QTextStream 类为文本的读写提供了便捷的接口。QTextStream 可以操作QIODevice 、QByteArray 或QString 。使用QTextStream 的流操作符,您可以方便地读写单词、行和数字。使用QTextStream 读取控制台输入并写入控制台输出也是很常见的做法。
在读取文本文件时,使用QTextStream 通常有三种方法:
- 按块读取,通过调用readLine() 或readAll()。
- 按单词处理。QTextStream 支持将数据流写入QString、QByteArray以及 char* 缓冲区。单词以空格分隔,行首的空白字符会被自动跳过。
- 按字符处理,通过流式输入到QChar 或 char 类型中。此方法常用于解析文件时的便捷输入处理,与字符编码和换行符语义无关。若要跳过空白字符,请调用skipWhiteSpace()。
QByteArray 可用于存储原始字节(包括\0 )和传统的 8 位、以 '\0' 结尾的字符串。 使用QByteArray 比使用 const char * 方便得多。它始终确保数据后跟一个 '\0' 终止符,并使用隐式共享类(写时复制)来减少内存占用并避免不必要的数据复制。
除了QByteArray 之外,Qt还提供了QString 类来存储字符串数据。 在大多数情况下,QString 是最佳选择。它存储16位Unicode字符。不过,当需要存储原始二进制数据,或者内存节省至关重要时(例如在Qt for Embedded Linux中),建议使用QByteArray 。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.