crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> Запись unsigned long в бинарный файл
vanvo
  опции профиля:
сообщение 30.10.2009, 21:24
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 73
Регистрация: 18.8.2008
Пользователь №: 267

Спасибо сказали: 0 раз(а)




Репутация:   0  


Вопрос наверняка жутко глупый, но не получается корректно записать, а затем считать числа.
unsigned long number;
QFile file ("gen.dat");
file.open(QIODevice::ReadOnly);
QDataStream fileStream(&file);
fileStream >> number;

Оператор << с ulong'ом не работает, а явное приведение типа к поддерживаемым приводит к вылетанию программы.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 30.10.2009, 21:32
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


а если unsigned long long?
QDataStream & QDataStream::operator>> ( qint64 & i )
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
vanvo
  опции профиля:
сообщение 30.10.2009, 21:41
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 73
Регистрация: 18.8.2008
Пользователь №: 267

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 30.10.2009, 22:32) *
а если unsigned long long?

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

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

Сообщение отредактировал vanvo - 30.10.2009, 21:43
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Авварон
  опции профиля:
сообщение 30.10.2009, 22:18
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 99
Регистрация: 26.4.2009
Пользователь №: 709

Спасибо сказали: 14 раз(а)




Репутация:   0  


Цитата(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
  опции профиля:
сообщение 30.10.2009, 22:21
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


На разных платформах 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
  опции профиля:
сообщение 30.10.2009, 22:22
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Тип long вообще не одноразмерный, он может быть 32 бита и больше. Это не допустимо в сериализации данных, где нужно знать точные размеры. Иначе придется еще к каждому числовому типу дополнительный байт размера приписывать.

Вылет происходит уже после загрузки 64 битного числа из потока в ulong? Проверь значения до записи в поток и после получения. Может быть число что-то теряет при приведении типа.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 30.10.2009, 23:29
Сообщение #7


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Для проверки можно так сделать:
unsigned long number;
...
qint64 number64 = (qint64)number;
qDebug() << "conversion passed";
fileStream << number64;
qDebug() << "streaming passed";
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 13.7.2020, 21:48