Форум программистов, компьютерный форум CyberForum.ru

Чтение файла с данными типа real. Тип real в билдере или как его "обойти"? - C++

Восстановить пароль Регистрация
 
 
Jaydens_Blues
0 / 0 / 0
Регистрация: 15.10.2014
Сообщений: 30
26.10.2015, 09:28     Чтение файла с данными типа real. Тип real в билдере или как его "обойти"? #1
Читаю файл в структуру,

C++
1
2
3
4
5
6
7
8
9
double Fdat;
 
struct STR
       {
        ...
 
       } rec
 
read( Fdat,(char *)&rec,sizeof(rec));
но данные на выходе получаются, вежливо говоря, не совсем те, которые должны. Описание струкруты самого файла у меня есть. Подозреваю, что проблема в том, что в структуре читаемого файла присутствует тип Real, 6 байт, а в билдере, как я понял, нет этого типа, есть float или double по 4 и 8 байт соответственно. Помимо этого, ещё в файле есть IUNT и UDINT, я их объявляю как unsigned int и unsigned long int, и это верно, если не ошибаюсь.
Читаю другие файлы другой структуры, где нет вещественного типа (и Fdat как int идёт), и всё как надо читается.
Верно ли я понял причину (real) и что можно сделать, какой тип объявить вместо real? Если все же double, то как читать 6 байт? Пробовал сделать так

C++
1
read( Fdat,(char *)&rec,sizeof(rec)-(sizeof(float))/2); // типа отнимаем 2 лишних байта
, но результата положительного это не дало. Помогите, пожалуйста. Спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.10.2015, 09:28     Чтение файла с данными типа real. Тип real в билдере или как его "обойти"?
Посмотрите здесь:

Дано: a:array[1…n] of real;p:real;k:integer;(a[1]<=a[2]<=⋯<=a[n],0<k≤n). C++
C++ Массив шаблонов или как обратиться к элементам разного типа, хранящиеся в одном "списке" по индексу
C++ Given real numbers a, b, c. Find if a quadratic inequality ах2 + bx + с = 0 has real roots. If it does, output them
аргумент типа "char *" несовместим с параметром типа "LPCWSTR" C++
"Stack overflow" как обойти? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4265 / 3696 / 1243
Регистрация: 14.04.2014
Сообщений: 14,479
26.10.2015, 13:53     Чтение файла с данными типа real. Тип real в билдере или как его "обойти"? #21
Ты покажи, как у тебя структура объявлена.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jaydens_Blues
0 / 0 / 0
Регистрация: 15.10.2014
Сообщений: 30
27.10.2015, 06:27  [ТС]     Чтение файла с данными типа real. Тип real в билдере или как его "обойти"? #22
Цитата Сообщение от nmcf Посмотреть сообщение
Ты покажи, как у тебя структура объявлена.
Она объявлена вот так:

C++
1
2
3
4
5
6
7
8
9
10
struct STR {
                  unsigned int    Year;
                  unsigned int    Month;
          unsigned int    Day;
          unsigned int    Hour;
                  unsigned int    Minute;
                  unsigned int    Second;
                  bool A;
                  double data[n];               // то самое real                 
} rec;
И когда считываю, все данные неверные выходят, из всех полей. Как я понимаю, из-за изначально неверного sizeof, потому что объявлен double
nmcf
4265 / 3696 / 1243
Регистрация: 14.04.2014
Сообщений: 14,479
27.10.2015, 06:55     Чтение файла с данными типа real. Тип real в билдере или как его "обойти"? #23
Вот так надо, если там один real:
C++
1
2
3
4
5
6
7
8
9
10
struct STR {
                  unsigned int    Year;
                  unsigned int    Month;
          unsigned int    Day;
          unsigned int    Hour;
                  unsigned int    Minute;
                  unsigned int    Second;
                  bool A;
                  char real48[6];               // то самое real                 
} rec;
Ну и где-то вне этой структуры хранить полученный после преобразования double.
Jaydens_Blues
0 / 0 / 0
Регистрация: 15.10.2014
Сообщений: 30
27.10.2015, 08:04  [ТС]     Чтение файла с данными типа real. Тип real в билдере или как его "обойти"? #24
Цитата Сообщение от nmcf Посмотреть сообщение
Ну и где-то вне этой структуры хранить полученный после преобразования double.
Меня что-то стали терзать смутные сомнения... По поводу того, а почему вообще во всех полях данные некорректные? Если в объявленной структуре что-то не то, это сказывается вообще на все получаемые данные или же , например, как минимум самое первое считываемое значение Year должно быть корректным при условии верного объявления его типа данных? Потому что самое первое значение Year одно и то же, если только я тип не меняю, например, на char. И значение это неверное
Fulcrum_013
 Аватар для Fulcrum_013
393 / 566 / 60
Регистрация: 14.12.2014
Сообщений: 4,769
Завершенные тесты: 2
27.10.2015, 08:16     Чтение файла с данными типа real. Тип real в билдере или как его "обойти"? #25
Цитата Сообщение от Jaydens_Blues Посмотреть сообщение
И когда считываю, все данные неверные выходят, из всех полей. Как я понимаю, из-за изначально неверного sizeof, потому что объявлен double
ну при таких раскладах однозначно нужен sizeof-2 байт на структуру читать.

Добавлено через 6 минут
Это если выравнивание не учитывть. Поэтому и говорю сделай на Дельфе копию паскалевской структуры и ее чтение из типизированного файла, а уже в Builder-е приделай оператор копирования к этой своей с++ структуре из дельфовской.
nmcf
4265 / 3696 / 1243
Регистрация: 14.04.2014
Сообщений: 14,479
27.10.2015, 08:20     Чтение файла с данными типа real. Тип real в билдере или как его "обойти"? #26
Ну если размер структуры не верный, то будет сдвиг и поля до real будут верны только у самой первой структуры, если ты их, конечно, правильно объявил. Что там за UINT? Это древний 16-битный int или современный? А выравнивание задаёшь?
Что известно про ту структуру? Какой размер в байтах?
Fulcrum_013, ну при чём тут Delphi? Надо выяснить размеры полей.
Jaydens_Blues
0 / 0 / 0
Регистрация: 15.10.2014
Сообщений: 30
27.10.2015, 08:26  [ТС]     Чтение файла с данными типа real. Тип real в билдере или как его "обойти"? #27
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
ну при таких раскладах однозначно нужен sizeof-2 байт на структуру читать.
В случае, если есть массив, то, наверное, sizeof-(2*N), где N это размер массива? Да в любом случае, хоть сколько отнимаю, самое первое считываемое значение первого поля (Year) остается неизменным. При многократном чтении из цикла, последующие - да, меняются, хотя и там мало чего адекватного. Такое ощущение, что меня немножко...гм... дезинформировали со структурой, что ли.

Добавлено через 5 минут
Цитата Сообщение от nmcf Посмотреть сообщение
Ну если размер структуры не верный, то будет сдвиг и поля до real будут верны только у самой первой структуры, если ты их, конечно, правильно объявил. Что там за UINT? Это древний 16-битный int или современный? А выравнивание задаёшь?
Ну вот, значит надо добиваться правильности данных до Real сперва... Выравнивание, это которое data alignment в настройках билдера? Да, я пробую разные значения, мало что меняется в положительную сторону, по-умолчанию Double Word стоит и файлы немного другого типа открываются хорошо
nmcf
4265 / 3696 / 1243
Регистрация: 14.04.2014
Сообщений: 14,479
27.10.2015, 08:27     Чтение файла с данными типа real. Тип real в билдере или как его "обойти"? #28
Тебе известно какие значения записаны в файл, скажем, для первой структуры? Т. е. что должно быть в полях по-правильному? Дамп сделай и покажи.
Fulcrum_013
 Аватар для Fulcrum_013
393 / 566 / 60
Регистрация: 14.12.2014
Сообщений: 4,769
Завершенные тесты: 2
27.10.2015, 08:56     Чтение файла с данными типа real. Тип real в билдере или как его "обойти"? #29
Цитата Сообщение от nmcf Посмотреть сообщение
ну при чём тут Delphi? Надо выяснить размеры полей.
Компилятор выяснит. Кстати то что ты насчитаешь в памяти с учетом выравнивания может не соответствовать тому что в файле. Причина - выравнивание, и как паскаль его обрабатывает при записи в типизированный файл. При том что есть нативные для билдера средства чтения этих файлов, а не этот байтослесарный лисапед и пляска с бубном для определения сайза для каждого варианта структуры.

Добавлено через 3 минуты
Цитата Сообщение от Jaydens_Blues Посмотреть сообщение
Такое ощущение, что меня немножко...гм... дезинформировали со структурой, что ли.
Паскалевский вариант структуры в студию плиз. И версию паскаля. Но так понимаю паскаль додельфовый. в дельфовом пользовали бы TDateTime для времени а не этот хоровод. И Real был бы 8 байтным double. Прога вообще 32-битная или 16-битная?
Jaydens_Blues
0 / 0 / 0
Регистрация: 15.10.2014
Сообщений: 30
27.10.2015, 09:41  [ТС]     Чтение файла с данными типа real. Тип real в билдере или как его "обойти"? #30
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Паскалевский вариант структуры в студию плиз
Значит буду пытать авторов программы, структуру смотреть непосредственно в коде и т.д, т.к. про неё практически не знаю ничего. Другие файлы, с которыми нет проблем, как раз используют и TDateTime, не использует вещественные типы и т.д. и всё там нормально. Но зачем-то они сделали несколько вариаций программы и получается всё через одно место, они сами же разными программами открывают эти же свои файлы... Я вот одну хочу сделать. Ладно, буду экспериментировать и попутно пытать людей)

Добавлено через 1 минуту
Цитата Сообщение от nmcf Посмотреть сообщение
Тебе известно какие значения записаны в файл, скажем, для первой структуры? Т. е. что должно быть в полях по-правильному?
Точно я знаю дату, которая должна быть, вот я и пытаюсь вытянуть хотя бы год 2015, а получается фигня, какой бы я тип вместо UINT не задал
nmcf
4265 / 3696 / 1243
Регистрация: 14.04.2014
Сообщений: 14,479
27.10.2015, 12:24     Чтение файла с данными типа real. Тип real в билдере или как его "обойти"? #31
В файле просто структуры, заголовка нет? Дамп в любом hex-редакторе сделай, или в том же Far открой в Hex и покажи.
Fulcrum_013
 Аватар для Fulcrum_013
393 / 566 / 60
Регистрация: 14.12.2014
Сообщений: 4,769
Завершенные тесты: 2
28.10.2015, 04:13     Чтение файла с данными типа real. Тип real в билдере или как его "обойти"? #32
Цитата Сообщение от Jaydens_Blues Посмотреть сообщение
Другие файлы, с которыми нет проблем, как раз используютTDateTime, не использует вещественные типы и т.д
TDateTime это double с набором операторов преобразования. Целая часть - дни, дробная время суток. Он только в дельфе появился. Если в них есть TDateTime значит делалась прога на дельфе. А в ней real=double, и вообще все типы аналогичны билдеровским. Но есть разница в работе с файлами. в дельфе/паскале файлы типизированы но типу записи (record аналог struct в с) и могут выравнивание как всей записи так и каждого поля обрабатывать совсем не так как запись одним куском через fread/fwrite.
Jaydens_Blues
0 / 0 / 0
Регистрация: 15.10.2014
Сообщений: 30
28.10.2015, 06:50  [ТС]     Чтение файла с данными типа real. Тип real в билдере или как его "обойти"? #33
Цитата Сообщение от nmcf Посмотреть сообщение
В файле просто структуры, заголовка нет? Дамп в любом hex-редакторе сделай, или в том же Far открой в Hex и покажи.
Во всяком случае, про него мне ничего не сказали. А начало выглядит как-то так

Чтение файла с данными типа real. Тип real в билдере или как его "обойти"?
Fulcrum_013
 Аватар для Fulcrum_013
393 / 566 / 60
Регистрация: 14.12.2014
Сообщений: 4,769
Завершенные тесты: 2
28.10.2015, 07:13     Чтение файла с данными типа real. Тип real в билдере или как его "обойти"? #34
Цитата Сообщение от Jaydens_Blues Посмотреть сообщение
Во всяком случае, про него мне ничего не сказали. А начало выглядит как-то так
Если там нет заголовка, то что там делают текстовые данные?
Jaydens_Blues
0 / 0 / 0
Регистрация: 15.10.2014
Сообщений: 30
28.10.2015, 07:23  [ТС]     Чтение файла с данными типа real. Тип real в билдере или как его "обойти"? #35
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Если там нет заголовка, то что там делают текстовые данные?
Получается, он есть? Мне его надо как-то "пропустить" и читать уже после него?
Fulcrum_013
 Аватар для Fulcrum_013
393 / 566 / 60
Регистрация: 14.12.2014
Сообщений: 4,769
Завершенные тесты: 2
28.10.2015, 07:38     Чтение файла с данными типа real. Тип real в билдере или как его "обойти"? #36
Цитата Сообщение от Jaydens_Blues Посмотреть сообщение
Мне его надо как-то "пропустить" и читать уже после него?
Если там есть заголовок то в нем скорее всего есть и откуда начинать читать. А вполне возможно и формат записи, на что наталкивает текст, который по всей видимости является именами полей структуры.
Jaydens_Blues
0 / 0 / 0
Регистрация: 15.10.2014
Сообщений: 30
28.10.2015, 07:46  [ТС]     Чтение файла с данными типа real. Тип real в билдере или как его "обойти"? #37
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Если там есть заголовок то в нем скорее всего есть и откуда начинать читать. А вполне возможно и формат записи, на что наталкивает текст, который по всей видимости является именами полей структуры.
Да, там все поля структуры, даже каждый элемент data есть, data[0], data[1] и т.д. А вот дальше уже периодически повторяющаяся информация, которая уже не так понятна, вернее, совсем непонятна. Видимо, это и есть сами данные
Fulcrum_013
 Аватар для Fulcrum_013
393 / 566 / 60
Регистрация: 14.12.2014
Сообщений: 4,769
Завершенные тесты: 2
28.10.2015, 08:01     Чтение файла с данными типа real. Тип real в билдере или как его "обойти"? #38
Цитата Сообщение от Jaydens_Blues Посмотреть сообщение
которая уже не так понятна, вернее, совсем непонятна. Видимо, это и есть сами данные
А в заголовке соответственно их описание. как вариант формат длина и смещение в записи.
Jaydens_Blues
0 / 0 / 0
Регистрация: 15.10.2014
Сообщений: 30
28.10.2015, 08:06  [ТС]     Чтение файла с данными типа real. Тип real в билдере или как его "обойти"? #39
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
А в заголовке соответственно их описание. как вариант формат длина и смещение в записи.
В принципе есть какие-то варианты, как это все верно считать? Или это "читай то, сам не знаешь что" и без авторов программы не обойтись?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2015, 08:17     Чтение файла с данными типа real. Тип real в билдере или как его "обойти"?
Еще ссылки по теме:

Составить процедуру Change Vector для умножения всех элементов вектора на число типа real C++
C++ Класс "Квадрат" с данными центр квадрата и его сторона

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Fulcrum_013
 Аватар для Fulcrum_013
393 / 566 / 60
Регистрация: 14.12.2014
Сообщений: 4,769
Завершенные тесты: 2
28.10.2015, 08:17     Чтение файла с данными типа real. Тип real в билдере или как его "обойти"? #40
Цитата Сообщение от Jaydens_Blues Посмотреть сообщение
Или это "читай то, сам не знаешь что"
Ну если есть заголовок то что есть это "сам не знаешь что" выяснить гораздо проще. Естественно с описанием формата от авторов вообще было бы просто.
Yandex
Объявления
28.10.2015, 08:17     Чтение файла с данными типа real. Тип real в билдере или как его "обойти"?
Ответ Создать тему
Опции темы

Текущее время: 17:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru