crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Запись unsigned long в бинарный файл
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Litkevich Yuriy Дата 30.10.2009, 23:29
  Для проверки можно так сделать:
unsigned long number;
...
qint64 number64 = (qint64)number;
qDebug() << "conversion passed";
fileStream << number64;
qDebug() << "streaming passed";
SABROG Дата 30.10.2009, 22:22
  Тип long вообще не одноразмерный, он может быть 32 бита и больше. Это не допустимо в сериализации данных, где нужно знать точные размеры. Иначе придется еще к каждому числовому типу дополнительный байт размера приписывать.

Вылет происходит уже после загрузки 64 битного числа из потока в ulong? Проверь значения до записи в поток и после получения. Может быть число что-то теряет при приведении типа.
BRE Дата 30.10.2009, 22:21
  На разных платформах 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 ) )
Авварон Дата 30.10.2009, 22:18
 
Цитата(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
vanvo Дата 30.10.2009, 21:41
 
Цитата(Litkevich Yuriy @ 30.10.2009, 22:32) *
а если unsigned long long?

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

но тогда программа вылетает... Менять тип переменной number нежелательно. А никак нельзя записать "чистый" unsigned long?
Litkevich Yuriy Дата 30.10.2009, 21:32
  а если unsigned long long?
QDataStream & QDataStream::operator>> ( qint64 & i )
vanvo Дата 30.10.2009, 21:24
  Вопрос наверняка жутко глупый, но не получается корректно записать, а затем считать числа.
unsigned long number;
QFile file ("gen.dat");
file.open(QIODevice::ReadOnly);
QDataStream fileStream(&file);
fileStream >> number;

Оператор << с ulong'ом не работает, а явное приведение типа к поддерживаемым приводит к вылетанию программы.
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 29.3.2024, 10:58