QDataStream和QByteArray的区别

3
QTemporaryFile tf;
tf.open ();
QDataStream tfbs (&tf);
tfbs << "hello\r\n" << "world!\r\n";
const int pos = int (tf.pos ());

QByteArray ba;
ba.append ("hello\r\n");
ba.append ("world!\r\n");
const int size = ba.size ();

我的问题基本上是,我做错了什么?为什么pos > size?我不应该使用<<吗?我不应该使用QDataStream吗?

编辑:有没有一种方法可以配置QDataStream或QTemporaryFile,使<<操作符不会在字符串前加上32位长度并将空终止符存储在文件中?当我只有一系列带引号的字符串和QString时,调用QDataStream::writeBytes会产生非常丑陋的代码。


如果您能指出possize实际上是什么,那将会很有帮助。 - jkerian
pos == 25,size == 15 - cppguy
第一个是流,第二个是数组,它们有完全不同的用途,通常一起使用。 - dtech
我知道它们有不同的用途。我只是想了解为什么我的临时文件比预期的要大。 - cppguy
3个回答

2
答案在文档中。我不会详细介绍QByteArray,因为我认为它的工作原理非常明显。
QDataStream操作符<< (char*)重载求值为writeBytes()函数
该函数输出:

将长度说明符len和缓冲区s写入流并返回对流的引用。 len被序列化为quint32,后跟来自s的len字节。 请注意,数据未编码。

因此,对于"hello\r\n",我期望输出为:
0,0,0,8,'h','e','l','l','o','\r','\n',0

4字节的长度,后跟来自字符串的字节。字符串结束的NULL也可能被添加到末尾,这就解释了多出来的两个字节。

是的,我错过了那个。希望有一种标准的更清晰的方法来将字符串写入临时文件。 - cppguy
@cppguy - 也许可以用QTextStream? - dtech
不幸的是,我正在编写字符串,然后是一个大的QByteArray。我希望有一些东西可以处理所有这些情况。 - cppguy

0

所以我最终编写了自己的帮助类来序列化我的数据:

class QBinaryStream
{
public:
    QBinaryStream (QIODevice& iod) : m_iod (iod) {}
    QBinaryStream& operator << (const char* data)
    {
        m_iod.write (data);
        return *this;
    }
    QBinaryStream& operator << (const QString& data)
    {
        return operator << (data.toUtf8 ());
    }
    QBinaryStream& operator << (const QByteArray& data)
    {
        m_iod.write (data);
        return *this;
    }

private:
    QIODevice& m_iod;
};

0
我不应该使用QDataStream吗?
在你的情况下,也许QTextStream甚至是QString会更好。
QTextStream类提供了一个方便的接口来读写文本。QTextStream可以操作QIODevice、QByteArray或QString。使用QTextStream的流运算符,您可以方便地读取和写入单词、行和数字。
至于QByteArray,尽可能使用QString。
QByteArray 类提供了一个字节数组。 QByteArray 可用于存储原始字节(包括 '\0')和传统的 8 位 '\0' 结尾的字符串。使用 QByteArray 比使用 const char * 更方便。在幕后,它总是确保数据后面跟随着 '\0' 终止符,并使用隐式共享(写时复制)来减少内存使用量并避免不必要的数据复制。 除了 QByteArray 外,Qt 还提供了 QString 类来存储字符串数据。对于大多数情况来说,QString 是您想要使用的类。它存储 16 位 Unicode 字符,使得在应用程序中存储非 ASCII/非 Latin-1 字符变得容易。此外,QString 在 Qt API 中广泛使用。QByteArray 适用的两种主要情况是当您需要存储原始二进制数据时和内存保护至关重要时(例如,在 Qt for Embedded Linux 中)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接