Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Запись unsigned long в бинарный файл
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Ввод/Вывод, Сеть. Межпроцессное взаимодействие
vanvo
Вопрос наверняка жутко глупый, но не получается корректно записать, а затем считать числа.
unsigned long number;
QFile file ("gen.dat");
file.open(QIODevice::ReadOnly);
QDataStream fileStream(&file);
fileStream >> number;

Оператор << с ulong'ом не работает, а явное приведение типа к поддерживаемым приводит к вылетанию программы.
Litkevich Yuriy
а если unsigned long long?
QDataStream & QDataStream::operator>> ( qint64 & i )
vanvo
Цитата(Litkevich Yuriy @ 30.10.2009, 22:32) *
а если unsigned long long?

Пробовал явно приводить
fileStream << (qint64)number;

но тогда программа вылетает... Менять тип переменной number нежелательно. А никак нельзя записать "чистый" unsigned long?
Авварон
Цитата(vanvo @ 30.10.2009, 21:41) *
Цитата(Litkevich Yuriy @ 30.10.2009, 22:32) *
а если unsigned long long?

Пробовал явно приводить
fileStream << (qint64)number;

но тогда программа вылетает... Менять тип переменной number нежелательно. А никак нельзя записать "чистый" unsigned long?


//qglobal.h
typedef unsigned int quint32;      /* 32 bit unsigned */
typedef unsigned long long quint64; /* 64 bit unsigned */

//Mac Os 10.6, qt 4.5
BRE
На разных платформах long может иметь разный размер.
На 32 битной - 4 байта, на 64 битной - 8 байт.
Поэтому лучше использовать переменные с заданной размерностью (quint32/quint64).
Посмотри размер твоего unsigned long.
qDebug() << sizeof( unsigned long );

Или использовать raw-data:
int QDataStream::writeRawData ( const char * s, int len )
int QDataStream::readRawData ( char * s, int len )

unsigned long value = 100;
writeRawData( (const char*)&value, sizeof( value ) )
...
readRawData( (char*)&value, sizeof( value ) )
SABROG
Тип long вообще не одноразмерный, он может быть 32 бита и больше. Это не допустимо в сериализации данных, где нужно знать точные размеры. Иначе придется еще к каждому числовому типу дополнительный байт размера приписывать.

Вылет происходит уже после загрузки 64 битного числа из потока в ulong? Проверь значения до записи в поток и после получения. Может быть число что-то теряет при приведении типа.
Litkevich Yuriy
Для проверки можно так сделать:
unsigned long number;
...
qint64 number64 = (qint64)number;
qDebug() << "conversion passed";
fileStream << number64;
qDebug() << "streaming passed";
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2020 IPS, Inc.