Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 11.04.2015
Сообщений: 87

Чтение структуры из файла

20.05.2019, 11:27. Показов 2335. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно считать структуру из файла .def но по итогу выводит: cþÞD:\Topolog_6329\PDMC\VT5491_PDMC_4\VT 5491N_6IN_m_4_150.t29 61138 0
ãèÿ 16641 0
k‡AV-«v AV-«v AV-«v AV-«v A3333k‡AffffîzAffffîzAffffîzAffffîzAffff îzAÍÌÌÌì‹ß@ 60416 0
0 0
0 0
3 0
14677 0
3 0

12 0
3 0
œ 24823 0
0 0
uo 0 0
0 0
и т.д.


Что не так?


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <vcl.h>
#include <stdio.h>
#include <DateUtils.hpp>
#include <Sysutils.hpp>
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int n;
bool flag=0;
FILE *f;
char s[]="DB-1 VT5491N_6IN_m_4_150.def";
struct kab{
 char NameFileTop[92];
 unsigned __int16 VersionVedom[2];
 unsigned __int16 Date[3];
}b;
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
           Memo1->Lines->Clear();
if ( (f=fopen(s,"rb+"))==NULL )  { ShowMessage("Файла нет!");return;}
 
int i=2;
while(fread(&b,sizeof(kab),1,f))
  {
           Memo1->Lines->Add(AnsiString(b.NameFileTop)+"  "+AnsiString(b.VersionVedom[2])+"  "+AnsiString(b.Date[3])+"    ");
  i++;
  }
fclose(f);
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.05.2019, 11:27
Ответы с готовыми решениями:

Чтение структуры из файла
Всем привет! читаю файл через бинарный режим содержимое файла(HEX) : 50 49 43 40 50 23 00 4A 50 47 00 00 FF D8 FF E0 00 10 ...

Чтение определенной структуры из файла
Требуется сделать так, чтобы в поля на форме попадали данные из файла. В самом файле все представлено в виде большого количества структур с...

Запись/чтение структуры в файл
Необходимо записать, а потом прочесть структуру в/из файла. Структура Prog.h struct sBlack { AnsiString Pol1; AnsiString Pol5; ...

20
0 / 0 / 0
Регистрация: 11.04.2015
Сообщений: 87
20.05.2019, 12:00  [ТС]
Вот сам файл.
Вложения
Тип файла: rar DB-1 VT5491N_6IN_m_4_150.rar (4.7 Кб, 3 просмотров)
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
20.05.2019, 13:01
Цитата Сообщение от Alexsandr_97 Посмотреть сообщение
Что не так?
Не такая структура, какую программа ожидает - это во-первых. Ваша структура содержит символьное поле длиной 92 б. плюс пять беззнаковых short. А вы что программе скармливаете?...

Ну, и потом такое вот
C++
1
AnsiString(b.____
применительно к WORD - не вполне, по моему (я уже не говорю об индексах).
0
0 / 0 / 0
Регистрация: 11.04.2015
Сообщений: 87
20.05.2019, 13:32  [ТС]
А как тогда вывести необходимую структуру?
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
20.05.2019, 14:43
Вы думаете - здесь есть прорицатели? Я за восемь лет не встречал... . Давайте максимум информации, может быть что-нибудь и придумается.

Добавлено через 50 минут
Если уверены в правильности структуры kab, то запишите на другую кнопку такой код__
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  strcpy(s,"temp.txt");
  if ( (f=fopen(s,"wb+"))==NULL )  { ShowMessage("Файла нет!");return;}
 
     for(int i=0;i<Memo1->Lines->Count;i++)
     {
       ZeroMemory(&b,sizeof(b));
       strcpy(b.NameFileTop ,Memo1->Lines->Strings[i].c_str());
       b.VersionVedom[0] = 80+i;
       b.Date[0] = 80-i;
       fwrite(&b.NameFileTop, sizeof(b.NameFileTop), 1, f);
       fwrite(&b.VersionVedom, sizeof(b.VersionVedom), 1, f);
       fwrite(&b.Date, sizeof(b.Date), 1, f);
     }
   fclose(f);
}
наберите затем в программе в поле Memo1 несколько текстовых строчек, нажмите эту дополнительную кнопку - и проанализируйте в каком-нибудь hex-редакторе полученный файл temp.txt. Станет яснее, какого рода файл нужно предлагать программе.
0
0 / 0 / 0
Регистрация: 11.04.2015
Сообщений: 87
20.05.2019, 15:50  [ТС]
Структуру я полностью не заполнял, а взял только необходимые 3 поля, но когда я заполнил ее полностью, то ничего не поменялось. А что касается файла, то мне нужно достать информацию конкретно из def-файла.

Добавлено через 6 минут
В Memo, в самом начале выводит строку: D:\Topolog_6329\PDMC\VT5491_PDMC_4\VT549 1N_6IN_m_4_150.t29
Ее необходимо так же вывести как поле FileNameTop. Почему то ее выводит полностью и не "коверкает" непонятными символами.

Добавлено через 7 минут
Если что, то вот вся структура, но 'union' я не прописывал.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
union { char Bt [512];
     struct {
            unsigned __int32    Defec;              
   
        char            NameFileTop [92];   
            char            NameTop[16];  
            char            NLayer[4];                  
            unsigned __int32    KolPolRetcl;        
            double                  SizeStrip;              
            unsigned __int32    Mirror;                 
            unsigned __int32    TipTop;                 
            unsigned __int32    TipSize;                
    
            unsigned __int32    DO;                     
            double                  XYmark[8];      
            double                  XYmetki[3];     
            double                  XStrip;                 
            double                  YStrip;                 
 
            double                  Area_Off_X;               
            double                  Area_Size_X;            
            unsigned __int32    SEG_SIZE_X;     
            unsigned __int32    SEG_SIZE_Y;     
            unsigned __int32    KOL_POL;            
            unsigned __int32    N_POL;                  
            unsigned __int32    KOL_SUB_POL;        
 
            unsigned __int32    Maskir;             
            unsigned __int32    MaxDef;             
            unsigned __int32    FiltrX;             
            unsigned __int32    FiltrY;             
  
            unsigned __int16    Date[3];            
            unsigned __int16    Time[3];            
            unsigned __int16    TimeScan[3];    
            unsigned __int32    Count_Def;          
            unsigned __int32    All_Defects;        
 
            unsigned __int32    Off_Sprav;          
 
            unsigned __int16    VersionVedom[2];    
            char            DescriptorSystem[3][16];   
            double                  DOdouble;           
 
            double                  XStrip1;       
            double                  YStrip1;       
 
            unsigned __int32    Mode;         
            unsigned __int32    Porog;         
            unsigned __int32    ColorTop;    
            unsigned __int32    deltaProek;        
 
    } Data;     
} DataPattern;
Добавлено через 2 минуты
Однако в "полной версии" структуры нет имени, меня это как то путает (как к ней обращаться, работать и т.д.).


А что касается union - я вообще не понимаю, что это такое и для чего нужно.

P.S. Не судите строго
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
20.05.2019, 16:38
Цитата Сообщение от Alexsandr_97 Посмотреть сообщение
что касается union - я вообще не понимаю, что это такое
Ну, так яснее немного. Операция union позволяет обращаться к данным в одной области, используя различные указатели. Так, в вашем случае символьный массив DataPattern размером 512 байтов (char Bt[512]) - это фактически та же структура Data, имеющая целую кучу именованных полей.
Например, такой код__
C++
1
2
3
4
5
6
     if ( (f=fopen(s,"rb+"))==NULL )  { ShowMessage("Файла нет!");return;}
     fread(&DataPattern.Bt,512,1,f) ;
 
      Label1->Caption = (String)(DataPattern.Bt+0x60) ;
      Label2->Caption = (String)DataPattern.Data.NameTop ;
      fclose(f);
считает из файла начальные 512 байтов и выведет поле, содержащее слово Топология в одном случае (метка1) используя обращение к массиву char, а в другом (метка2) используя обращение к полю структуры.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33395 / 21505 / 8236
Регистрация: 22.10.2011
Сообщений: 36,902
Записей в блоге: 12
20.05.2019, 16:40
Цитата Сообщение от Alexsandr_97 Посмотреть сообщение
В Memo, в самом начале выводит строку: D:\Topolog_6329\PDMC\VT5491_PDMC_4\VT549 1N_6IN_m_4_150.t29
Ее необходимо так же вывести как поле FileNameTop. Почему то ее выводит полностью и не "коверкает" непонятными символами.
Возможно, потому что в названии файла нет кириллицы? Ваш К.О.

С другой стороны, я сделал вот так:

C++
1
  Memo1->Lines->Add(String().sprintf(L"%s %s", String(b.NameFileTop), String(b.NameTop)));
, и у меня в XE4 прекрасно отображает строку
D:\Topolog_6329\PDMC\VT5491_PDMC_4\VT5491N_6IN_m_4_150.t29 Топология в начале Memo (с исправленной структурой, разумеется). А вот дальше - полный бардак. Потому что больше при просмотре файла ничего, хотя бы отдаленно напоминающего путь, не наблюдается. Что ты вообще ждешь от файла-то? Что должно вывести? Пример вывода есть? Или мы опять ищем черную кошку, которой нет, в темной комнате?
0
0 / 0 / 0
Регистрация: 11.04.2015
Сообщений: 87
21.05.2019, 09:50  [ТС]
Потрясающе!

Однако не могу понять почему такой вывод сработал. Но пока не убрал 'L' - выводило ошибку.

Что касается вывода, то должно вывести:

VersionVedom = 1.3
NameFileTop = D:\Topolog_6329\PDMC\VT5491_PDMC_4\VT549 1N_6IN_m_4_150.t29
Date = 5.4.2017
Count_Def = 124

При выводе Count_Def почему то получаю '524288'

Когда пытаюсь вывести 'VersionVedom' и 'Date' то получаю ошибку:
[C++ Error] Unit1.cpp(103): E2285 Could not find a match for 'AnsiString::AnsiString(unsigned short *)'
[C++ Error] Unit1.cpp(103): E2031 Cannot cast from 'unsigned short *' to 'AnsiString'
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33395 / 21505 / 8236
Регистрация: 22.10.2011
Сообщений: 36,902
Записей в блоге: 12
21.05.2019, 10:51
Цитата Сообщение от Alexsandr_97 Посмотреть сообщение
При выводе Count_Def почему то получаю '524288'
Я при выводе Count_Def получаю 8 (это уже BCB6, ты кстати так и не озвучил версию Билдера), и это полностью совпадает с ожидаемым. Потому что вот так переменная b отображается в Debug Inspector-е:



А с остальными полями вообще бред какой-то. Не хранится ни в одном из полей Date то, что написано выше, ни в явном виде, ни после преобразования через DateToStr...

А в VersionVedom вообще оба нуля.
0
0 / 0 / 0
Регистрация: 11.04.2015
Сообщений: 87
21.05.2019, 11:23  [ТС]
Я через 6й Билдер делаю.

А Debug Inspector действительно какую то ерунду показывает.

Смог вывести поле Date, при помощи преобразования IntToStr, но вывело единицу.
С VersionVedom происходит тоже самое (единица).

Что касается остальных полей, то они должны быть такими:
NLayer = 1
Mirror = 0
TipTop = 1
TipSize = 2
KolPolRetcl = 215
XStrip = 143197,8
YStrip =143197,8
Area_Size_X = 1403
SEG_SIZE_X = 9353
SEG_SIZE_Y = 2048
KOL_POL = 10
N_POL = 102
KOL_SUB_POL = 8
MaxDef = 200000
TIME = 11:5:39
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33395 / 21505 / 8236
Регистрация: 22.10.2011
Сообщений: 36,902
Записей в блоге: 12
21.05.2019, 11:36
Нет таких значений. А кто этот файл записывал? Посмотреть бы на код записи... Там явно что-то не то. Уже даже потому, что размер файла = 20444 байт, и он нацело не делится на размер структуры, равный 512 байт. Как, в таком случае, оно записано?
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
21.05.2019, 11:47
Вообще, я в легком шоке от вашей структуры...
После небольшой корректировки "ея" с таким кодом__
C++
1
2
3
4
5
6
7
8
9
10
    fread(&DataPattern.Data,512,1,f) ;  // Bt
    Memo1->Lines->Add(String().sprintf("VersionVedom = %u\.%u",
                  DataPattern.Data.VersionVedom[0],
                  DataPattern.Data.VersionVedom[1]));
    Memo1->Lines->Add(String().sprintf("Date = %u\.%u\.%u",
                  DataPattern.Data.Date[0],
                  DataPattern.Data.Date[1],
                  DataPattern.Data.Date[2]));
    Memo1->Lines->Add(String().sprintf("Count_Def = %u",
                  DataPattern.Data.Count_Def));
получаю в Memo1:

Но в структуре поля следуют как бы правильно:
C++
1
2
3
4
5
6
           unsigned __int32    FiltrY;
            unsigned __int16    Date[3];
            unsigned __int16    Time[3];
            unsigned __int16    TimeScan[3];
            unsigned __int32    Count_Def;
            unsigned __int32    All_Defects;
а при извлечении Count_Def берётся не со своего места, а на пару байтов смещённым!!
то-есть BF вместо 7C. Что это.. - выравнивание на границу слова, или у меня весеннее обострение?
0
0 / 0 / 0
Регистрация: 11.04.2015
Сообщений: 87
21.05.2019, 12:17  [ТС]
У меня выводит совершенно другое
Изображения
 
0
0 / 0 / 0
Регистрация: 11.04.2015
Сообщений: 87
21.05.2019, 12:26  [ТС]
Совершенно не понимаю в чем дело...
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
21.05.2019, 13:39
Давайте пока совсем крыша не поехала - выложите свой рабочий файл ( .def) еще раз в нескольких форматах (в явном виде, архиве zip, архиве rar). Хотя всё равно я не могу понять, как из структуры конкретные поля извлекает моя программа; эксперименты с этим только запутали... .

Добавлено через 12 минут
.. когда перед компиляцией программы меняю в опциях программы Advanced Compiler - Data alignment c QuadWord на Byte - всё меняется. Наверное рыть надо в эту сторону.

Добавлено через 13 минут
Нормально срабатывает, если перед DataPattern явно указывать тип (USHORT, UINT)
Memo1
Date = 5.4.2017
Count_Def = 124
VersionVedom = 1.3
Но всё равно в начале структуры мне пришлось добавить фейковых 40 байтов, чтоб выйти на соответствие.
ЧТО-ТО Я НЕ ПОНИМАЮ...
1
0 / 0 / 0
Регистрация: 11.04.2015
Сообщений: 87
21.05.2019, 13:42  [ТС]
В опциях я ставил значение на Word, пробовал Byte - ничего не меняется.
Вложения
Тип файла: zip DB-1 VT5491N_6IN_m_4_150.zip (5.8 Кб, 2 просмотров)
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
21.05.2019, 13:50
Лучший ответ Сообщение было отмечено Alexsandr_97 как решение

Решение

Alexsandr_97, попробуйте определить так структуру__
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
union { char Bt [512];
     struct {
            unsigned __int32    Defec;
            char                NameFileTop [92];
            char                NameTop[16];
            char                NLayer[4];
            char                 fake[0x28];    ///   added
            unsigned __int32    KolPolRetcl;
            double              SizeStrip;
            unsigned __int32    Mirror;
            unsigned __int32    TipTop;
            unsigned __int32    TipSize;
            unsigned __int32    DO;
            double              XYmark[8];
            double              XYmetki[3];
            double              XStrip;
            double              YStrip;
            double              Area_Off_X;
            double              Area_Size_X;
            unsigned __int32    SEG_SIZE_X;
            unsigned __int32    SEG_SIZE_Y;
            unsigned __int32    KOL_POL;
            unsigned __int32    N_POL;
            unsigned __int32    KOL_SUB_POL;
            unsigned __int32    Maskir;
            unsigned __int32    MaxDef;
            unsigned __int32    FiltrX;
            unsigned __int32    FiltrY;
            unsigned __int16    sDate[3];
            unsigned __int16    sTime[3];
            unsigned __int16    TimeScan[3];
            unsigned __int32    Count_Def;
            unsigned __int32    All_Defects;
            unsigned __int32    Off_Sprav;
            unsigned __int16    VersionVedom[2];
            char                DescriptorSystem[3][16];
            double              DOdouble;
            double              XStrip1;
            double              YStrip1;
            unsigned __int32    Mode;
            unsigned __int32    Porog;
            unsigned __int32    ColorTop;
            unsigned __int32    deltaProek;
 
    } Data;
} DataPattern;
и в обработчике кнопки написать следующее__
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void __fastcall TForm1::Button4Click(TObject *Sender)
{
  if ( (f=fopen(s,"rb+"))==NULL )  { ShowMessage("Файла нет!");return;}
    fread(&DataPattern.Data,512,1,f) ;
    Memo1->Lines->Add(String().sprintf("Date = %u\.%u\.%u",
                  (USHORT)DataPattern.Data.sDate[0],
                  (USHORT)DataPattern.Data.sDate[1],
                  (USHORT)DataPattern.Data.sDate[2]));
    Memo1->Lines->Add(String().sprintf("Count_Def = %u",
                  (UINT)DataPattern.Data.Count_Def));
    Memo1->Lines->Add(String().sprintf("VersionVedom = %u\.%u",
                  (UINT)DataPattern.Data.VersionVedom[0],
                  (UINT)DataPattern.Data.VersionVedom[1]));
 
    fclose(f);
}
Что получится?
1
0 / 0 / 0
Регистрация: 11.04.2015
Сообщений: 87
21.05.2019, 13:52  [ТС]
Да ладно!
Изображения
 
0
0 / 0 / 0
Регистрация: 11.04.2015
Сообщений: 87
21.05.2019, 13:57  [ТС]
Как это работает?

Добавлено через 4 минуты
А что насчет NameFileTop?

Пробую таким же образом вывести - не выходит.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.05.2019, 13:57
Помогаю со студенческими работами здесь

Запись/чтение структуры целиком
как записать структуру одним разом грубо говоря на псевдо коде так: struct Struct { AnsiString g; AnsiString b; } main...

Запись и чтение структуры (целые числа)
Есть структура: typedef struct { unsigned int a; int b; } VVV; extern VVV vvv; Есть функция записи структуры в...

Запись/чтение структуры с полем типа String в бинарный файл
Доброго времени суток. Есть слудующая структура struct R { int Number; String Name; String Nick; String email;

запись и чтение структуры данных в файл(объектная реализация)
Есть двухуровневая структура данных(линейная). Она построена на указателях. Из книги Лафоре: &quot;Можно даже не пытаться произвести...

Чтение структуры из файла
(программа на С) В общем, задача написать программу, которая из файла вида: будет заносить данные в структуру (фио, год рождения,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru