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&gt;尺寸?我不应该使用&lt;&lt; ?我应该不使用QDataStream吗?
编辑:有没有办法配置QDataStream或QTemporaryFile以便&lt;&lt;运算符不预先添加32位长度的字符串并将空终止符存储在文件中?当我只有一系列带引号的字符串和QStrings时,调用QDataStream :: writeBytes会产生非常难看的代码。
答案 0 :(得分:2)
答案在文档中。我不打算超过QByteArray,因为我相信它的工作正如预期的那样显而易见。
QDataStream运算符&lt;&lt;(char *)重载计算为the writeBytes() function。
此功能输出:
将长度说明符len和缓冲区s写入流和 返回对流的引用。 len被序列化为quint32, 来自s的len个字节。请注意,数据未编码。
因此对于"hello\r\n"
,我希望输出为:
0,0,0,8,'h','e','l','l','o','\r','\n',0
4字节长度,后跟字符串中的字节。字符串结尾的NULL可能也被添加到结尾,这将解释另外两个神秘的额外两个字节。
答案 1 :(得分: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;
};
答案 2 :(得分:0)
我不应该使用QDataStream吗?
在您的情况下,QTextStream
甚至QString
可能会这样做。
QTextStream类为阅读和提供了方便的界面 写文本。
QTextStream可以在QIODevice,QByteArray或QString上运行。 使用QTextStream的流媒体操作符,您可以方便地阅读和 写单词,行和数字。
至于QByteArray
,Qstring
应该尽可能优先选择
QByteArray类提供一个字节数组。
QByteArray可用于存储两个原始字节(包括'\ 0')和 传统的8位'\ 0'终止字符串。使用QByteArray很多 比使用const char *更方便。在幕后,它始终如一 确保数据后跟'\ 0'终止符,并使用 隐式共享(copy-on-write)以减少内存使用并避免 不必要的数据复制。
除了QByteArray之外,Qt还提供了要存储的QString类 字符串数据。对于大多数用途,QString是您要使用的类。 它存储16位Unicode字符,便于存储 应用程序中的非ASCII /非Latin-1字符。此外, Qttring在Qt API中使用。两个主要案例在哪里 当你需要存储原始二进制数据时,QByteArray是合适的, 当内存保护很关键时(例如,使用Qt for Embedded) 的Linux)。