文件和数据流函数
QIODevice类是Qt核心中所有I/O设备的基接口类。QIODevice提供了一个常见的实现和一个抽象接口,用于支持读取和写入数据块的设备。设备可以是内存缓冲区、文件或数据流。
一些子类,如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)和传统的 '\0' 结束的 8 位字符串。使用 QByteArray 比使用 const char* 更方便。它总是确保数据后有 '\0' 结尾符,并使用隐式共享类(写时复制)来减少内存使用和避免不必要的数据复制。
除了 QByteArray 之外,Qt 还提供了 QString 类用于存储字符串数据。对于大多数用途,QString 是最合适的类。它存储 16 位 Unicode 字符。然而,在需要存储原始二进制数据且内存保护至关重要的场合(例如,在 Qt for Embedded Linux 中),使用 QByteArray 是一个好主意。
© 2024 Qt 公司有限。此处包含的文档贡献属于其各自所有者的版权。所提供的文档受到免费软件基金会发布的 GNU 自由文档许可协议版本 1.3 的条款约束。Qt 及相关标志是芬兰 Q 整合科技有限公司以及/或世界各地的商标。所有其他商标均为其各自所有者的财产。