Потоковое чтение данных в Qt (30.11.2018). Печать
2018 - Ноябрь
30.11.2018 18:14
Save & Share
Комментарии из рабочего файла: какие нюансы возникают при использовании объекта класса QDataStream.

Особенности потокового экспорта (что как записывается при каждой операции "<<"):
- текст в кавычках (записывается как char*) создает 4 байта информации "сколько байт записано в поток + 1", количество байт записанной информации, один завершающий байт (терминатор?) "00".
    Текст "31" будет записан как префикс "00-00-00-03" (3 байта с завершающим), "33" как символ "3", "31" как символ "1", завершающий байт "00".
- целочисленное число (записывается как 4-байтовый int) создает 4 байта информации. Попытка записать число больше приводит к его записи как нескольких интов.
    Число 258 будет записано как 4 байта "00-00-01-02". Число "4.343.434.343" будет записано как 8 байт (2 инта) "00-00-00-01 02-E3-8C-67".
    Отрицательные числа также успешно записываются в рамках 4 байт, вплоть до -2147483647.
    На практике беззнаковый целочисленный максимум упирается в 18446744073709551615 (8 байт по FF);
- QString создает 4 байта информации "сколько байт записано в поток", двойное количество байт записанной информации (на 1 символ отводится 2 байта).
    Текстовая строка "5.1.2.1" будет записана как "00-00-00-0E" (2*7 символов), "00-35-00-2E-00-31-00-2E-00-32-00-2E-00-31" (каждый из 7 символов будет "00-xx").
    На практике удалось экспортировать строку 600млн знаков, больше не смог: закончилась RAM (OpenSuse v.12.1). В Windows XP x32 при большем количестве RAM - удалось экспортировать всего 300млн знаков;
- QStringList записывается по неизвестному алгоритму;
- QByteArray записывается как char*;
- остальные типы данных - стандартны. float и double записываются как 8 байт, short int - 2 байта, bool - 1 байт (значения 1 или 0).

Общее:
- поток не способен работать с переменными типа long int, long double - накладывает ограничения на экспорт;
- изменение типа хотя бы одной переменной при работе с потоком может привести к ошибке импорта. То есть, жесткая привязка к типу данных;
- структура файла хороша для программного чтения, но не для ручного. При наличии большого количества параметров QString/Char* приходится считать байты на распечатке;
- при работе с хешем, записью в файл и потоком - перед инициализацией хеша нужно закрыть и открыть файл заново!!!
Обновлено ( 30.11.2018 18:18 )