Russian Qt Forum

Qt => Общие вопросы => Тема начата: nik135 от Февраль 01, 2008, 09:50



Название: Как прочитать из файла TDateTime?
Отправлено: 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 читается нормально, а вот с датой белиберда какая-то.
Подскажите, где моя ошибка?



Название: Re: Как прочитать из файла TDateTime?
Отправлено: Tonal от Февраль 01, 2008, 11:17
Совершенно разные форматы, поэтому так прочитать естетсвенно не получиться.
Есть несколько выходов:
1) Разобраться как делфи хранит TDateTime в памяти (размер TDateTime в делфи может не совпадать с размером double в твоём компиляторе), зачитать это поле в массив байт и разобрать то, что там есть.
2) Попросить разработчиков софтинки сохранять в каком-нибудь общем формате
3) Написать мелкую длл-ку на дельфи, которой отдавать добытое значение TDateTime, а она бы переводила его во что-то удобоваримое. :-)


Название: Re: Как прочитать из файла TDateTime?
Отправлено: Sokoloff от Февраль 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


Название: Re: Как прочитать из файла TDateTime?
Отправлено: DpoHro от Февраль 04, 2008, 13:42
Есть файл, в который из под Дельфей писали некую структуру, в числе которой есть TDateTime. Как мн е прочесть это значение? То, что это обычный double, я знаю. В каком виде double пишется в файл?
В виде 8 байт.
Насамом деле странно, так как и в C++ и в Delphi тип double = 8 байт
Попробуй не структурой читать, а последовательно тип за типом...


Название: Re: Как прочитать из файла TDateTime?
Отправлено: nik135 от Февраль 04, 2008, 14:56
Я знаю, 8 байт.  :)
Только вопрос в этом и заключается, как из этих восьми байт получить нужный double.

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


Название: Re: Как прочитать из файла TDateTime?
Отправлено: vregess от Февраль 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];


Название: Re: Как прочитать из файла TDateTime?
Отправлено: nik135 от Февраль 06, 2008, 12:40
vregess, СПАСИБО!

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

зы. хочу сделать свой класс, для конвертирования туда-обратно. Не подскажите, что нужно определить в классе, чтобы его можно было использовать в структуре, которая пишется/читается из файла?


Название: Re: Как прочитать из файла TDateTime?
Отправлено: Alex03 от Февраль 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)