QTextStream: Qt 提供的文本输入输出流

发布时间:2023-05-16

在 Qt 中,我们可以使用 QTextStream 来实现对文本文件的输入输出操作。QTextStream 提供了方便的方法来读写文件、字符串和标准输入输出。本文将会从以下几个方面介绍 QTextStream 的使用:

一、QByteArray 转 QString

我们知道,在处理二进制数据的时候,通常会使用 QByteArray 类型进行存储和传输。但是有时候我们需要将 QByteArray 转换成文字格式的数据,这时候我们就需要用到 QTextStream 了。 示例代码如下:

QByteArray array = QByteArray::fromHex("E4 B8 AD E6 96 87"); // 二进制数据
QString str;
QTextStream stream(&str, QIODevice::WriteOnly);
stream << array;
qDebug() << str; // 输出: 中文

在上面的示例中,我们通过 fromHex 函数将十六进制字符串转成二进制数据,再使用 QTextStream 将二进制数据转成了 UTF-8 编码的中文字符。

二、QString 转 QByteArray

与将 QByteArray 转成 QString 相似,我们也可以使用 QTextStream 将 QString 转成二进制数据。 示例代码如下:

QString str = "中文";
QByteArray array;
QTextStream stream(&array, QIODevice::WriteOnly);
stream << str;
qDebug() << array.toHex(); // 输出: e4b8ade69687

在上面的示例中,我们通过 QTextStream 将 UTF-8 编码的中文字符转成二进制数据,再通过 toHex 函数将二进制数据转成了十六进制字符串。

三、从文件中读取数据

当我们需要从文件中读取数据时,QTextStream 提供了 read、readLine 和 operator>> 等函数。 示例代码如下:

QFile file("example.txt");
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
    QTextStream stream(&file);
    QString line;
    while (!stream.atEnd()) {
        stream >> line;
        qDebug() << line;
    }
    file.close();
}

在上面的示例中,我们打开名为 example.txt 的文件,并通过 QTextStream 对其进行读取。每次读取一行,直到文件结束。

四、向文件中写入数据

与从文件中读取类似,QTextStream 也提供了 write、writeLine 和 operator<< 等函数来向文件中写入数据。 示例代码如下:

QFile file("example.txt");
if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
    QTextStream stream(&file);
    stream << "Hello, ";
    stream << "world!" << endl;
    file.close();
}

在上面的示例中,我们写入了两行数据到 example.txt 文件中,分别为 "Hello, " 和 "world!"。

五、基于 QTextStream 的自定义输入输出操作符

我们可以基于 QTextStream 的输入输出操作符来定义自己的输入输出格式。 示例代码如下:

class MyType {
public:
    int value1;
    float value2;
};
QTextStream &operator<<(QTextStream &stream, const MyType &type)
{
    stream << type.value1 << " " << type.value2;
    return stream;
}
QTextStream &operator>>(QTextStream &stream, MyType &type)
{
    stream >> type.value1 >> type.value2;
    return stream;
}
int main()
{
    MyType t = { 42, 3.14f };
    QString str;
    QTextStream stream(&str, QIODevice::ReadWrite);
    stream << t;
    qDebug() << str; // 输出: 42 3.14
    stream.seek(0);
    MyType t2;
    stream >> t2;
    qDebug() << t2.value1 << t2.value2; // 输出: 42 3.14f
    return 0;
}

在上面的示例中,我们定义了一个名为 MyType 的结构体,并基于 QTextStream 的输入输出操作符来定义了 MyType 的输入输出格式。最后我们创建了一个 MyType 类型的变量 t,并通过 QTextStream 将其写入到了字符串 str 中。再将 str 中的数据读出来,并通过 qDebug 输出。