Russian Qt Forum
Ноябрь 25, 2024, 14:41 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: чтение структур из файла[Решено]  (Прочитано 5458 раз)
Larry
Гость
« : Октябрь 16, 2012, 15:44 »

Добрый день, форумчане! Не могу решить задачу и никак не дам ей ладу. Есть типизированный файл. Структура известна - записаны структуры с полями:
Код:
struct POSITION_T
{
double latitude; // широта
double longitude; // долгота
};

Пытался читать как и стандартными средствами с++, так и средствами Qt. При попытке прочитать с помощью ifstream, то не могу открыть файл, а при попытке окрыть с помощью QFile, то получаю непонятные данные:
2.04666e+223
-5.12741e-107

Вот слот для загрузки файла:
Код:
QString fname_qstr = QFileDialog::getOpenFileName(this, tr("Открыть карту"), NULL, tr("map (*.*)"));
QByteArray fname_ba = fname_qstr.toAscii();
char *fname_chr = fname_ba.data();

std::ifstream file(fname_chr, std::ios::binary);

if(file.is_open())
qDebug() << tr("Загрузка карты");
else
qDebug() << tr("Не удалось открыть файл: ") << fname_chr;

POSITION_T position = {0.0, 0.0};

file >> position.latitude;
file >> position.longitude;

qDebug() << position.latitude;
qDebug() << position.longitude;

file.close();

QFile File(fname_qstr);

if(!File.open(QIODevice::ReadOnly))
qDebug() << tr("Не удалось открыть файл: ") << fname_chr;
else
qDebug() << tr("Загрузка карты");

QDataStream data(&File);

data >> position.latitude;
data >> position.longitude;

qDebug() << position.latitude;
qDebug() << position.longitude;

File.close();
« Последнее редактирование: Октябрь 16, 2012, 16:08 от Larry » Записан
mutineer
Гость
« Ответ #1 : Октябрь 16, 2012, 15:46 »

А записываются данные в файл как?
Записан
Larry
Гость
« Ответ #2 : Октябрь 16, 2012, 15:50 »

Файл конвертируется из файлов *.mp (карты) в программе на pascal. Доступа к ней не имею. Записывается как типизированный файл. Узнал, что запись идет блоками по 16 байт (2*double)...
Записан
ssoft
Гость
« Ответ #3 : Октябрь 16, 2012, 15:56 »

Возможно, порядок байт необходимо задать.
По умолчанию Qt использует BigEndian, а для ПК часто родной LitleEndian.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Октябрь 16, 2012, 16:03 »

Возможно, порядок байт необходимо задать.
По умолчанию Qt использует BigEndian, а для ПК часто родной LitleEndian.
Точнее - QDataStream по умолчанию пишет/читает данные в BigEndian. Надо попробовать
Код
C++ (Qt)
QDataStream data(&File);
data.setByteOrder(QDataStream::LittleEndian);
 
Записан
Larry
Гость
« Ответ #5 : Октябрь 16, 2012, 16:07 »

Да спасибо я уже попробовал, и это помогло, большое-большое спасибо Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.108 секунд. Запросов: 23.