文件和数据流函数
QIODevice 类是 Qt 中所有 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 支持向QStrings、QByteArrays 和 char* 缓冲区流式传输。单词以空格分隔,前导空白会自动跳过。
- 通过流式输入QChar 或 char 类型,逐个字符输入。这种方法通常用于在解析文件时方便地处理输入,与字符编码和行尾语义无关。要跳过空白区域,请调用skipWhiteSpace().
QByteArray 可用于存储原始字节(包括 )和传统的 8 位"(0)"结尾字符串。使用 比使用 const char * 方便得多。它始终确保数据后面有一个"(0)"结束符,并使用\0
QByteArray 隐式共享类(写时复制)来减少内存使用量,避免不必要的数据复制。
除了QByteArray 之外,Qt XML 还提供了用于存储字符串数据的QString 类。对于大多数用途,QString 是最合适的类。它存储 16 位 Unicode 字符。不过,当您需要存储原始二进制数据时,以及当节约内存至关重要时(例如,Qt for Embedded Linux),使用QByteArray 是个好主意。
© 2025 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.