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> размер? Должен ли я не использовать << ? Я не должен использовать QDataStream?
Изменить: Есть ли способ настроить QDataStream или QTeoraryFile так, чтобы << оператор не добавляет в строку строки длиной 32 бита и не сохраняет нулевые терминаторы в файле? Вызов QDataStream :: writeBytes, когда у меня просто есть серия строк в кавычках, а QStrings делает код очень уродливым.
Ответ в документах. Я не собираюсь переходить на QByteArray, так как считаю, что вполне очевидно, что он работает так, как ожидалось.
Оператор QDataStream<<(char *) перегрузка оценивается как функция writeBytes ().
Эта функция выводит:
Записывает спецификатор длины len и буфер s в поток и
возвращает ссылку на поток. Len сериализуется как квинт32,
затем следуют len байтов из s. Обратите внимание, что данные не закодированы.
Таким образом, для "hello\r\n"
Я ожидаю, что результат будет:
0,0,0,8,'h','e','l','l','o','\r','\n',0
Длина 4 байта, за которой следуют байты из строки. NULL, заканчивающийся строкой, вероятно, также добавляется в конец, что будет содержать загадочные два дополнительных байта.
Поэтому я написал свой собственный вспомогательный класс для сериализации моих данных:
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;
};
Я не должен использовать 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 для Embedded
Linux).