文件和数据流函数

QIODevice类是Qt核心中所有I/O设备的基接口类。QIODevice提供了一个常见的实现和一个抽象接口,用于支持读取和写入数据块的设备。设备可以是内存缓冲区、文件或数据流。

一些子类,如QFile,已经使用内存缓冲区实现,用于中间存储数据。这通过减少读写操作来加速程序。缓冲区使得如getChar()和putChar()这样的函数变得更快,因为它们可以操作内存缓冲区而不是直接操作设备本身。

QFile类提供了从文件读取和写入文件的功能。一个QFile可以使用本身或者更方便地与QTextStreamQDataStream一起使用。

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)和传统的 '\0' 结束的 8 位字符串。使用 QByteArray 比使用 const char* 更方便。它总是确保数据后有 '\0' 结尾符,并使用隐式共享类(写时复制)来减少内存使用和避免不必要的数据复制。

除了 QByteArray 之外,Qt 还提供了 QString 类用于存储字符串数据。对于大多数用途,QString 是最合适的类。它存储 16 位 Unicode 字符。然而,在需要存储原始二进制数据且内存保护至关重要的场合(例如,在 Qt for Embedded Linux 中),使用 QByteArray 是一个好主意。

© 2024 Qt 公司有限。此处包含的文档贡献属于其各自所有者的版权。所提供的文档受到免费软件基金会发布的 GNU 自由文档许可协议版本 1.3 的条款约束。Qt 及相关标志是芬兰 Q 整合科技有限公司以及/或世界各地的商标。所有其他商标均为其各自所有者的财产。