Форум программистов, компьютерный форум, киберфорум
C++/CLI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
 Аватар для Dostik
38 / 38 / 4
Регистрация: 31.05.2011
Сообщений: 580

Чтение данных из бинарного файла

29.10.2015, 15:14. Показов 1353. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем добрый день, разбираюсь с чтением бинарных файлов, застрял на том что чтение не производится нужным образом, приведу кусок кода который использовался через WinAPI :
C++
1
2
3
4
5
6
7
f_per=CreateFile("fpereval.dat",GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
 if (f_per==INVALID_HANDLE_VALUE) {}
                     else {
                SetFilePointer(f_per,(sizeof(str_pereval)*(k-1)),NULL,FILE_BEGIN);
                ReadFile(f_per,&mp,(sizeof(str_pereval)),&writed_per,NULL);
                CloseHandle(f_per);
                          };
Далее я обращаюсь
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void __fastcall TForm1::Calc_res_Val()
{
 for (int k=0; k<8; k++)
 {
  res_v[k]=1.-(per[k].Pm/res_val_m[k])-(per[k].Pp/res_val_p[k]);
  if (res_v[k]>0.)
   {
    res_m[k]=res_val_m[k] * res_v[k];
    res_p[k]=res_val_p[k] * res_v[k];
    }
     else {res_m[k]=0.; res_p[k]=0.;}
 
  }
}
С помощью tezaurismosis за что ему спасибо, была переделана значительная часть кода:
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
Void Calc_Res_Val ()
{
    HANDLE f_per;
    unsigned long writed_per;
array<double>^ res_val_m = gcnew array<double>{2700.,2100.,1300.,1000.,30000.,30000.,30000.,20000.};
array<double>^ res_val_p = gcnew array<double>{3500.,3000.,2200.,2000.,40000.,40000.,40000.,30000.};
array<Single>^res_m = gcnew array<Single>(8);
array<Single>^res_p = gcnew array<Single>(8);
array<str_pereval>^ per = gcnew array<str_pereval>(8);
str_pereval^ gg = gcnew str_pereval ();
 
     f_per=CreateFile("fpereval.dat",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
 if (f_per==INVALID_HANDLE_VALUE) {MessageBox::Show ("Нет файла");}
 
      else     {
                SetFilePointer(f_per,0,NULL,FILE_BEGIN);
                ReadFile(f_per,&per,(sizeof(str_pereval)*8),&writed_per,NULL);
                CloseHandle(f_per);
               }; 
 
 for (int k=0; k<8; k++)
 {
gg->res_v[k]=1.-(per[k].Pm/res_val_m[k])-(per[k].Pp/res_val_p[k]);
  if (gg->res_v[k]>0.)
   {
    res_m[k]=res_val_m[k] * gg->res_v[k];
    res_p[k]=res_val_p[k] * gg->res_v[k];
    }
     else {res_m[k]=0.; res_p[k]=0.;}
  }
 
 }
но на выходе я получил ошибку:
Кликните здесь для просмотра всего текста
Помощник отладки управляемого кода "FatalExecutionEngineError" обнаружил неполадку в "C:\Users\Ethernet\Documents\Visual Studio 2012\Projects\mfc\Debug\mfc.exe".

Дополнительные сведения: The runtime has encountered a fatal error. The address of the error was at 0x6718df03, on thread 0x168c. The error code is 0xc0000005. This error may be a bug in the CLR or in the unsafe or non-verifiable portions of user code. Common sources of this bug include user marshaling errors for COM-interop or PInvoke, which may corrupt the stack.
Если для этого исключения имеется обработчик, выполнение программы может быть продолжено безопасно.

Так же с подсказки tezaurismosis, направив меня в сторону System::IO::File::ReadAllLines, я написал код:
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
public: value class str_pereval
{
public:
    int nk;                
    int N_vn,N_vv;         
    Single d_vn,d_vv;       
    DateTime^ t_n;         
    DateTime^ t_k;         
    Single L;               
    Single P,Pm,Pp;         
    Single kal_n,kal_v;     
    array<Single>^ res_v;           
    array<Single>^ frez;         
    array<int>^ irez;
 
    str_pereval(int size) {
        frez = gcnew array<float>(size);
        irez = gcnew array<int>(size);
    }
 
        };
array<str_pereval>^ per = gcnew array<str_pereval>(8);
str_pereval^ gg = gcnew str_pereval ();
 
String^ f_per = "fpereval.dat";
 
BinaryReader^ binr = gcnew BinaryReader(File::Open(f_per,FileMode::Open)); 
 
{
             // пока не достигнут конец файла
                // считываем каждое значение из файла
    while (binr->PeekChar() > -1)
             {
                    array<str_pereval>^ per = gcnew array<str_pereval>(8);
               
               
                for (int k=0; k<4;k++){
                        per[k].N_vv = binr->ReadInt32();}
но на выходе я не получаю нужных мне данных, просто мусор, помогите разобраться с чтением бинарных файлов, смещение по файлу, и т.д., всем спасибо
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.10.2015, 15:14
Ответы с готовыми решениями:

Чтение бинарного файла на visual c++
Здравствуйте) Я хочу написать свой архиватор на vc++ 2008(ибо язык можно выучить только что-то написав на нем), раньше писал консольные...

Загрузка данных из Excel (только чтение из файла) и запись в БД
Загрузка данных из Excel (только чтение из файла) и запись в БД. Вопрос: как проще открыть в ASP.Net Excel-файл (самое главное), и...

Запись и чтение бинарного файла
в общем, имею форму, задача которой при нажатии кнопки записать из TextBox1, 2, 3... в бинарный файл такие значения, типа: Name Login ...

5
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9670 / 4823 / 762
Регистрация: 17.04.2012
Сообщений: 9,661
Записей в блоге: 14
29.10.2015, 18:26
Dostik, хотя бы кусок fpereval.dat не дадите? И ещё значения, которые должны оттуда получить. Тестировать нужно на чём-то
1
 Аватар для Dostik
38 / 38 / 4
Регистрация: 31.05.2011
Сообщений: 580
30.10.2015, 09:16  [ТС]
tezaurismosis, Доброе утро, извиняюсь моя ошибка, прикладываю файл fpereval.rar
Данные которые нужно получить:
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
for (int i=0;i<4;i++)
 {     //в скобках описание что должны получить из файла
per[i].nk;    //( 1,2,3,4)
per[i].t_n;  // дата/ время ( 29.10.15 / 10:59;  28.10.15 / 18:05; 30.10.15 / 6:45; 29.10.15 / 10:59 )
per[i].P;    //  ( 830,2727; 1406,7128; 0 ; 830,2727)
per[i].Pm; // (0,0,0,0)
per[i].Pp; //  ( 830,2727; 1406,7128; 0 ; 830,2727)
res_v[j]; // (0.762;0.531;1;0.584)
per[i].d_vv;     //  ( 492; 485,399; 491,35; 501,0)   
per[i].d_vn;    //   (492; 484,75; 491,60;  502,64)
per[i].N_vv;   //    (105; 57; 104; 123)       
per[i].N_vn;  //     (134; 66 ; 92;  151)  
}
 
 
for (int j=4;j<8;j++)
 {
 per[j].nk;     // (1;2;3;4)
 per[j].t_n;   // (12.10.15 / 8:02; 22.10.15 / 10:37; 7.10.15 / 8:22; 7.10.15 / 8:22;)
 per[j].P      // (20599,30;5967,92;28045,44; 28045,44)  
 per[j].Pm; // (1877,11;699,38;5579,77;5580,77)
 per[j].Pp  // (20599,30;5967,92;28045,44; 28045,44)
 res_v[j]; // (0.469;0.844;0.252;-0.02)
 per[j].N_vv;   // (54;0;39;9)
 per[j].N_vn;  // (52;0;8;15)
  }
0
 Аватар для Dostik
38 / 38 / 4
Регистрация: 31.05.2011
Сообщений: 580
30.10.2015, 11:08  [ТС]
Немного разобравшись, пришел к такому выводу, файл читается в хаотичном порядке, тоесть - если i в цикле = 0
C++
1
2
3
4
for (int i=0;i<4;i++)
 {     //в скобках описание что должны получить из файла
per[i].N_vv;   //    (105; 57; 104; 123)       
}
(для примера, отладка по данному значению N_vv) я должен был получить 105, на выходе я получаю 1, тоесть данные per[i].nk;, если продолжить цикл и i = 1 то на выходе я получаю 134 а это данные уже per[i].N_vn;, продолжаем дальше цикл i = 2 и вот оно наше значение 105, значение цикла i = 3, на выходе получаю мусор 1140195328, нужно делать смещение, как это реализовать еще не нашел и не знаю, пока жду ответа поищу на просторах googl'a, спасибо всем кто заглянул

Добавлено через 39 минут
Со смещением тоже вроде как разобрался, можно делать следующим образом
C++
1
2
3
for (int k=0; k<4;k++){
                        per[k].N_vv = binr->ReadInt32();
                         int c = per[k].N_vv >> 1;   }
пока разбираюсь как сместить что бы было как тут
C++
1
2
3
4
5
6
7
8
f_per=CreateFile("fpereval.dat",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
 if (f_per==INVALID_HANDLE_VALUE) { }
 
      else     {
                SetFilePointer(f_per,0,NULL,FILE_BEGIN);
                ReadFile(f_per,&per,(sizeof(str_pereval)*8),&writed_per,NULL);
                CloseHandle(f_per);
               };
Добавлено через 21 минуту
Опять таки если исходи из этого куска
C++
1
2
3
4
5
6
7
8
f_per=CreateFile("fpereval.dat",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
 if (f_per==INVALID_HANDLE_VALUE) { }
 
      else     {
                SetFilePointer(f_per,0,NULL,FILE_BEGIN);
                ReadFile(f_per,&per,(sizeof(str_pereval)*8),&writed_per,NULL);
                CloseHandle(f_per);
               };
то мы смещаемся в строке и складываем все значения в &per значения храним в массиве от 0 до 7, пускай в нашем примере мы будем хранить данные от 0 до 3, массив заполняется всеми значениями из структуры.
Данные приведены выше, тогда получается правильно, данные заполняются построчно, итого в 1-й строке мы получаем значения которые я писал выше:
Цитата Сообщение от Dostik Посмотреть сообщение
для примера, отладка по данному значению N_vv) я должен был получить 105, на выходе я получаю 1, тоесть данные per[i].nk;, если продолжить цикл и i = 1 то на выходе я получаю 134 а это данные уже per[i].N_vn;, продолжаем дальше цикл i = 2 и вот оно наше значение 105
Единственное что не понятно, это то откуда берется мусор, и как заполнить правильно массив для всех значений как положено
0
 Аватар для Dostik
38 / 38 / 4
Регистрация: 31.05.2011
Сообщений: 580
30.10.2015, 11:20  [ТС]
выложу правильность последовательности хранения данных:
Кликните здесь для просмотра всего текста
0
 Аватар для Dostik
38 / 38 / 4
Регистрация: 31.05.2011
Сообщений: 580
30.10.2015, 11:23  [ТС]
соответственно, как я понял для начала нужно прочитать файл, а потом отсортировать данные в нужные мне переменные
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.10.2015, 11:23
Помогаю со студенческими работами здесь

Чтение данных из бинарного файла
программа должна считывать данные из бинарного файла, записывать их в переменную абстрактного типа данных, описанного в библиотеке, и...

Чтение данных из бинарного файла
читаю по while (!stream.eof()), проблема в том что в конце в условие лишний раз заходит, и пытается считать данные, хотя уже файл кончился,...

Чтение данных из бинарного файла в массив
Доброго всем времени суток. Мне нужно было прочитать из бинарного файла данные в массив int data; С этим я справился, но не...

Чтение бинарного файла и построение графика на основе его данных
Начал изучать c++ builder недавно и столкнулся с проблемой. Надо построить график, и при этом чтобы по одной кнопке происходила запись, а...

Чтение бинарного файла - чтение первых 9 байт
Есть код, который читает первые 9 байт бинарного файла(заголовок записи) void ATS44Encoder::FileEncode() { QFile* file = new...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru