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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как прочитать из файла TDateTime?  (Прочитано 7443 раз)
nik135
Гость
« : Февраль 01, 2008, 09:50 »

Есть файл, в который из под Дельфей писали некую структуру, в числе которой есть TDateTime. Как мн е прочесть это значение? То, что это обычный double, я знаю. В каком виде double пишется в файл?
Читаю так:

Код:
 struct  test_struct{
    ....
    quint16  key;
    double datetime;
} tst;

QFile file( "testfile.bin");
file.open(QIODevice::ReadOnly);
file.read((char*)&tst,sizeof(tst));

qDebug()<<tst.key; //ok
qDebug()<<tst.datetime; //not ok :-(

Причем значение key читается нормально, а вот с датой белиберда какая-то.
Подскажите, где моя ошибка?

Записан
Tonal
Гость
« Ответ #1 : Февраль 01, 2008, 11:17 »

Совершенно разные форматы, поэтому так прочитать естетсвенно не получиться.
Есть несколько выходов:
1) Разобраться как делфи хранит TDateTime в памяти (размер TDateTime в делфи может не совпадать с размером double в твоём компиляторе), зачитать это поле в массив байт и разобрать то, что там есть.
2) Попросить разработчиков софтинки сохранять в каком-нибудь общем формате
3) Написать мелкую длл-ку на дельфи, которой отдавать добытое значение TDateTime, а она бы переводила его во что-то удобоваримое. :-)
Записан
Sokoloff
Гость
« Ответ #2 : Февраль 04, 2008, 11:14 »

Вот дельфийский нелп для TDateTime:
Цитировать
TDateTime represents a date-and-time value in the Delphi language.

Unit

System

Delphi syntax:

type TDateTime = type Double;

Description

Most CLX objects represent date and time values using a TDateTime value. In Delphi, TDateTime is a type that maps to a Double. In C++, the TDateTime class corresponds to the Delphi TDateTime type.

The integral part of a Delphi TDateTime value is the number of days that have passed since 12/30/1899. The fractional part of the TDateTime value is fraction of a 24 hour day that has elapsed.

Following are some examples of TDateTime values and their corresponding dates and times:

0   12/30/1899 12:00 am
2.75   1/1/1900 6:00 pm
-1.25   12/29/1899 6:00 am
35065   1/1/1996 12:00 am
To find the fractional number of days between two dates, simply subtract the two values, unless one of the TDateTime values is negative. Similarly, to increment a date and time value by a certain fractional number of days, add the fractional number to the date and time value if the TDateTime value is positive.
When working with negative TDateTime values, computations must handle time portion separately. The fractional part reflects the fraction of a 24-hour day without regard to the sign of the TDateTime value. For example, 6:00 am on 12/29/1899 is –1.25, not –1 + 0.25, which would be –0.75. There are no TDateTime values between –1 and 0.

Note:   Delphi 1.0 calculated the date from year 1 instead of from 1899. To convert a Delphi 1.0 date to a TDateTime value in later versions of the Delphi language, subtract 693594.0 from the Delphi 1.0 date
Записан
DpoHro
Гость
« Ответ #3 : Февраль 04, 2008, 13:42 »

Есть файл, в который из под Дельфей писали некую структуру, в числе которой есть TDateTime. Как мн е прочесть это значение? То, что это обычный double, я знаю. В каком виде double пишется в файл?
В виде 8 байт.
Насамом деле странно, так как и в C++ и в Delphi тип double = 8 байт
Попробуй не структурой читать, а последовательно тип за типом...
Записан
nik135
Гость
« Ответ #4 : Февраль 04, 2008, 14:56 »

Я знаю, 8 байт.  Улыбающийся
Только вопрос в этом и заключается, как из этих восьми байт получить нужный double.

ps. последовательно пробовал.
Записан
vregess
Гость
« Ответ #5 : Февраль 04, 2008, 18:30 »

Я знаю, 8 байт.  Улыбающийся
Только вопрос в этом и заключается, как из этих восьми байт получить нужный double.

ps. последовательно пробовал.

может быть так?
Код:
union{
  double result;
  char byte[8];
} doubleConv;

// data - считанные из файла нужные 8 байт.
for(int i=0;i<8;i++)
  doubleConv.byte[i]=data[i];

// в doubleConv.result - получим нужное число.

// либо вот так:
for(int i=0;i<8;i++)
  doubleConv.byte[8-i]=data[i];
Записан
nik135
Гость
« Ответ #6 : Февраль 06, 2008, 12:40 »

vregess, СПАСИБО!

заработал первый вариант.

зы. хочу сделать свой класс, для конвертирования туда-обратно. Не подскажите, что нужно определить в классе, чтобы его можно было использовать в структуре, которая пишется/читается из файла?
Записан
Alex03
Гость
« Ответ #7 : Февраль 06, 2008, 15:21 »

vregess, СПАСИБО!

заработал первый вариант.

зы. хочу сделать свой класс, для конвертирования туда-обратно. Не подскажите, что нужно определить в классе, чтобы его можно было использовать в структуре, которая пишется/читается из файла?
Если первый вариант заработал, то и исходный должен работать, по всей видимости Вам мешало выравнивание.
что говорят?
Код:
qDebug()<< &tst.key;
qDebug()<< &tst.datetime;

Попробуйте для исходной структуры
Код:
#pragma pack (push, 1)
struct  test_struct{
    ....
    quint16  key;
    double datetime;
} tst;
#pragma pack (pop)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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