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位长度的字符串,并将空终止符存储在文件中?当我只有一系列带引号的字符串和QStrings时,调用QDataStream::writeBytes会使代码变得非常丑陋。
发布于 2013-04-18 09:16:14
答案就在文档中。我不打算介绍QByteArray,因为我相信很明显,它的工作方式与预期的一样。
QDataStream operator<<(char*)重载的计算结果为the writeBytes() function。
此函数输出:
将长度说明符len和缓冲区s写入流,并返回对流的引用。len被序列化为quint32,后跟s中的len字节。请注意,数据并未编码。
因此,对于"hello\r\n",我希望输出为:
0,0,0,8,'h','e','l','l','o','\r','\n',04字节长度,后跟字符串中的字节。字符串结尾的NULL可能也被添加到末尾,这将解释其他神秘的额外两个字节。
发布于 2013-04-18 09:47:03
所以我最终编写了自己的helper类来序列化我的数据:
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;
};发布于 2013-11-09 16:19:58
我不应该使用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/非拉丁-1字符。此外,在Qt中始终使用QString。QByteArray适用的两种主要情况是您需要存储原始二进制数据时,以及内存保护非常关键的情况(例如,对于嵌入式Linux使用Qt )。
https://stackoverflow.com/questions/16072812
复制相似问题