Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.89/35: Рейтинг темы: голосов - 35, средняя оценка - 4.89
 Аватар для Dostik
38 / 38 / 4
Регистрация: 31.05.2011
Сообщений: 580

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

03.11.2015, 11:07. Показов 7847. Ответов 48
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем добрый день, столкнулся с проблемой чтения структур из бинарного файла, много чего нового узнал и много в чем еще не разобрался, ниже приведу пример кода (пример брал с форумаЗапись структуры в бинарный файл) но у меня компилятор ругается на
Кликните здесь для просмотра всего текста
"System.IO.BinaryReader" не содержит определения для "ReadStruct" и не был найден метод расширения "ReadStruct", принимающий тип "System.IO.BinaryReader" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку)
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
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 1)]
        public struct str_pereval
        {
 
            public int nk;
            public int N_vn, N_vv;
            public Single d_vn, d_vv;
            public DateTime t_n;
            public DateTime t_k;
            public Single L;
            public Single P, Pm, Pp;
            public Single kal_n, kal_v;
            public Single[] res_v;
            public Single[] frez;
            public int[] irez;
 
            str_pereval(int size)
                : this()
            {
                frez = new float[size];
                irez = new int[size];
            }
            };
 
public class FileOperations
{
    str_pereval per = new str_pereval();
 
    public FileOperations()
    { this.per.nk = 1; }
 
    public void Read()
    {
        using (BinaryReader br = new BinaryReader(new FileStream("fpereval.dat", FileMode.Open)))
           this.per = br.ReadStruct <str_pereval>();
   }
}
public static class BinaryOperationExtension
{
    public static T ReadStruct<T>(BinaryReader reader) where T : struct
    {
        byte[] rawData = reader.ReadBytes(Marshal.SizeOf(typeof(T)));
        GCHandle handle = GCHandle.Alloc(rawData, GCHandleType.Pinned);
        var returnObject = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T));
        handle.Free();
        return returnObject;
    }
}
    }
    
}
fpereval.rar
Тема раньше создавалась на С++\СLI но по совету решил писать данный проект на C#
в теме указаны все выходные данные которые должны получить Чтение данных из бинарного файла Всем заранее спасибо
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.11.2015, 11:07
Ответы с готовыми решениями:

Чтение бинарного файла
проблема с чтением бинарного файла. если сделать так: byte buf_data = new byte; file.Read(buf_data, 0, 10); то в таком случае...

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

Чтение и запись бинарного файла
Помогите объяснить и переделать не большую программу с VB6 , на C#. А то перечитал много книг , но все равно некоторые моменты никак не...

48
 Аватар для Dostik
38 / 38 / 4
Регистрация: 31.05.2011
Сообщений: 580
05.11.2015, 10:56  [ТС]
Студворк — интернет-сервис помощи студентам
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Drawing;
using System.Globalization;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;
 
namespace ArcNew
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
          //  str_pereval.FileOperations rr = new str_pereval.FileOperations();
         //   rr.Read();
 
 
            DateTime dt = new DateTime();
            String[] format = new String[] { "ddMMyy" };
            String S, S1;
 
            dt = this.dateTimePicker1.Value;
            for (int i = 0; i < format.Length; i++)
            {
                S = dt.ToString(format[i], DateTimeFormatInfo.CurrentInfo);
                int Nsm = Convert.ToInt32(numericUpDown1.Value);
                /**/
                S1 = S;
                S = "s" + S;
                S = S + "_" + Nsm + ".dat";
 
                S1 = "d" + S1;
                S1 = S1 + "_" + Nsm + ".dat";
 
                String managedString = S1;
                var Nd = Marshal.StringToHGlobalAnsi(managedString);
 
 
                String managedStringg = S;
                var Ns = Marshal.StringToHGlobalAnsi(managedStringg);
            }
 
 
            for (int i = 0; i <= 3; i++)
            {
                dataGridView1.Rows.Add();
                dataGridView1.Rows[i].Cells[0].Value = (i + 1).ToString();
            }
           
           
             var list = new List<str_pereval>();
        using (var reader = new BinaryReader(File.OpenRead("fpereval.dat")))
        {
            while (reader.BaseStream.Position != reader.BaseStream.Length)
            {
                var obj2 = reader.ReadStruct<str_pereval>();
                list.Add(obj2);
            }
        }
 
 
        }
    }
 //================================
 
            
    
 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 1)]
public struct str_pereval
    {
        
 
        public int nk;
        public int N_vn, N_vv;
        public Single d_vn, d_vv;
        public DateTime t_n;
        public DateTime t_k;
        public Single L;
        public Single P, Pm, Pp;
        public Single kal_n, kal_v;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
        public float[] res_v;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
        public float[] frez;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
        public int[] irez;
     /*   public Single[] res_v;
       public Single[] frez;
       public int[] irez;
 
       str_pereval(int size)
           : this()
        {
           frez = new float[size];
           irez = new int[size];*/
        }
 
 
 
  /**/ public static class BinaryOperationExtension
    {
        public static T ReadStruct<T>(this BinaryReader reader) where T : struct
        {
 
 
            byte[] rawData = reader.ReadBytes(Marshal.SizeOf(typeof(T)));
            GCHandle handle = GCHandle.Alloc(rawData, GCHandleType.Pinned);
            var returnObject = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T));
            handle.Free();
            return returnObject;
        
        }
    
    } /**/
 
 
       
    }
Весь код прикладываю, может я что-то не туда засунул ?

Добавлено через 21 минуту
Заметил утечку памяти ArcNew.vshost.exe*32 висит в памяти завершить дерево процессов нельзя так как процесс запускается снова, либо не закрывается, папку Debug удалить невозможно, ссылаясь на запущенное данное приложение и тестовый бинарный файл file.bin

Добавлено через 3 минуты
Разобрался что это за файл и для чего он нужен
0
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
05.11.2015, 11:31
А скажите мне пожалуйста, зачем вы читаете в цикле, если у вас в первом посте была всего одна запись:
C#
1
this.per = br.ReadStruct <str_pereval>();
1
 Аватар для Dostik
38 / 38 / 4
Регистрация: 31.05.2011
Сообщений: 580
05.11.2015, 11:52  [ТС]
Konctantin, в первом посте как говорится я его слепила из того что было... прогуглив и наткнувшись на вашу тему, я от незнания скопипастил подставил свои значения и хотел разобраться как это все дело работает,
по поводу ошибки, нашел следующий момент если закоментировать в структуре
C#
1
2
  //public DateTime t_n;
    //public DateTime t_k;
тогда отладчик не ругается и вроде бы все хорошо, но я не получаю данные с двух значений t_n и t_k которые очень мне нужны, решил пойти другим путем и объявил их как переменные int но сохранены они были в билдере как дата\время и получаем мусор, также получаем мусор по всему файлу P = непонятным набором цифр, Рр и т.д очень много значений которые просто теряются

Добавлено через 2 минуты
Даже если просто закоментировать t_n и t_k также получаю мусор
0
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
05.11.2015, 11:54
Структура DateTime имеет размер 8 байт, а int 4 байта, из-за этого и мусор.

Даже если просто закоментировать t_n и t_k также получаю мусор
Вы так и не поняли смысл маршалинга.

прочитайте вот тут https://msdn.microsoft.com/ru-... .110).aspx и вот тут http://habrahabr.ru/post/114953/
1
 Аватар для Dostik
38 / 38 / 4
Регистрация: 31.05.2011
Сообщений: 580
05.11.2015, 11:54  [ТС]
и еще интересный момент, если вернуть
C#
1
2
 public DateTime t_n;
 public DateTime t_k;
то эти поля не заполняются нужным образом, а данные смещаются, и отображаются не там где нужно
0
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
05.11.2015, 12:05
так, от куда вы берете этот файл? на него есть спецификация? или как вы узнали его структуру?
0
 Аватар для Dostik
38 / 38 / 4
Регистрация: 31.05.2011
Сообщений: 580
05.11.2015, 12:24  [ТС]
Этот файл формирует программа разработанная в далеких 2000-х годах кем-то, и все года туда каждый что-то добавлял, эта программа хранит в себе технологический процесс производства, вы спросите зачем так усложнять ведь были БД и т.д, так вот к такому методу пришли только по тому что на то время не было сетей на участке,не было ПК на котором можно было разместить БД, был лишь 1 пк который формирует данные, и за стенкой 2-й пк который читает эти данные с бинарных файлов,
шли годы и сейчас идет большой передел, но отказаться полностью от старой системы учета и контроля одним махом невозможно, вы спросите а для чего переписывать что-то если это скоро отправится в архив?
Ну главным ответом на этот вопрос и пожалуй основным это желание и стремление научится разрабатывать приложения на .NET (C#, C++\CLI, и т.д), вторым это требование начальства, ну и третьим есть идея как собирать данные складывать их правильно в БД, и в случае отказа сети формировать временно данные в файл который после возобновления сети будет отправляться прямиком в БД.
По поводу спецификации, нету ничего, в коде нету элементарных комментариев,а переменные выглядят как набор букв т.д., просто анализируя код и параметры я имею представление что там должно хранится и отображаться.
Язык на котором написаны эти два приложения C++ Builder(5-6).
0
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
05.11.2015, 14:26
Скорее всего вы не правильно составили структуру. Или что-то не так поняли в старом коде.
0
 Аватар для Dostik
38 / 38 / 4
Регистрация: 31.05.2011
Сообщений: 580
05.11.2015, 14:42  [ТС]
Вот структура на С++
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
typedef struct {
int nk;            
int N_vn,N_vv;         
float d_vn,d_vv;        
TDateTime t_n;          
TDateTime t_k;         
float L;              
float P,Pm,Pp;        
float kal_n,kal_v;   
float res_v;          
float frez[4];        
int irez[4];          
} str_pereval;          
 
str_pereval mp0,mp,mp2,per[8];
А вот на С#
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public struct str_pereval
{  public int nk;
    public int N_vn, N_vv;
    public Single d_vn, d_vv;
    public DateTime t_n;
    public DateTime t_k;
    public Single L;
    public Single P, Pm, Pp;
    public Single kal_n, kal_v;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
    public float[] res_v;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
    public float[] frez;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
    public int[] irez;
}
Открытие файла на С++ средствами WinAPI
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);
               };
Добавлено через 2 минуты
могу только предполагать что не правильное смещение
0
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9674 / 4826 / 763
Регистрация: 17.04.2012
Сообщений: 9,664
Записей в блоге: 14
05.11.2015, 15:01
Видимо билдеровский TDateTime имеет другой, отличный от нетовского DateTime размер (или представление). Вполне вероятно, что там не мусор, а, например, ticks from epoch и их просто нужно конвертировать.
Попробуйте так: поставьте там int, приведите сюда то значение, которое вы считаете мусором и приведите дату, которая там должна получиться. Попробуем перевести.
1
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
05.11.2015, 15:09
Лучший ответ Сообщение было отмечено Dostik как решение

Решение

Вот правильная структура:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[StructLayout(LayoutKind.Sequential)]
public struct str_pereval
{
    public int nk;
    public int N_vn, N_vv;
    public float d_vn, d_vv;
    public DateTime t_n;
    public DateTime t_k;
    public float L;
    public float P, Pm, Pp;
    public float kal_n, kal_v;
    public float res_v;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
    public float[] frez;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
    public int[] irez;
};
Что было неправильно:
1) Выравнивать структуру не надо было.
2) Вы указали лишнее поле.
3) Вы указали неверный размер массива.
1
 Аватар для Dostik
38 / 38 / 4
Регистрация: 31.05.2011
Сообщений: 580
05.11.2015, 16:31  [ТС]
Огромное спасибо вам Konctantin, все работает как положено, спасибо за подробное объяснение, и за потраченное время

Добавлено через 1 минуту
tezaurismosis, Аналогично спасибо вам Алексей большое, за помощь, советы, и личное время

Добавлено через 1 час 2 минуты
Konctantin, Извините пожалуйста еще хочу задать вопрос по теме, если структура заполнялась в массиве ? как её заполнять в C#
пример на Builder
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
typedef struct {
int nk;            
int N_vn,N_vv;         
float d_vn,d_vv;        
TDateTime t_n;          
TDateTime t_k;         
float L;              
float P,Pm,Pp;        
float kal_n,kal_v;   
float res_v;          
float frez[4];        
int irez[4];          
} str_pereval;          
 
str_pereval mp0,mp,mp2,per[8];
а далее:
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.;}
 
  }
}
и еще заполнение в таблицу:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 for (int i=0;i<4;i++)
 {
 StringGrid8->Cells[i+1][0]="              "+IntToStr(per[i].nk);  
 StringGrid8->Cells[i+1][1]=
        FormatDateTime("d.mm.yy' / 'h:mm",(per[i].t_n));  
 StringGrid8->Cells[i+1][2]="  "+FloatToStrF(per[i].P,ffFixed,7,0)+"  /  "
                                +FloatToStrF((per[i].L/1000.),ffFixed,7,0);  
 StringGrid8->Cells[i+1][3]="  "+FloatToStrF(per[i].Pm,ffFixed,7,0)+"  /  "   
                                +FloatToStrF(res_m[i],ffFixed,7,0);
 StringGrid8->Cells[i+1][4]="  "+FloatToStrF(per[i].Pp,ffFixed,7,0)+"  /  "   
                                +FloatToStrF(res_p[i],ffFixed,7,0);
 StringGrid8->Cells[i+1][5]="    "+FloatToStrF((res_v[i]*100.),ffFixed,7,0);  
 StringGrid8->Cells[i+1][6]="   "+FloatToStrF(per[i].d_vv,ffFixed,7,2);      
 StringGrid8->Cells[i+1][7]="   "+FloatToStrF(per[i].d_vn,ffFixed,7,2);       
 StringGrid8->Cells[i+1][8]="   "+IntToStr(per[i].N_vv);                      
 StringGrid8->Cells[i+1][9]="   "+IntToStr(per[i].N_vn);                     
 }
0
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
05.11.2015, 16:53
Также, либо можете записывать все в List<str_pereval>, отображать также, либо можно забиндить данные.
Но это уже другая тема.
1
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
05.11.2015, 17:31
Лучший ответ Сообщение было отмечено Dostik как решение

Решение

Вот вам простейший пример того как это можно сделать
Вложения
Тип файла: zip TestStructStream.zip (11.4 Кб, 13 просмотров)
1
 Аватар для Dostik
38 / 38 / 4
Регистрация: 31.05.2011
Сообщений: 580
05.11.2015, 19:24  [ТС]
Konctantin, Большое спасибо за пример, но почему то я не могу его скомпилировать получаю 8 ошибок
C#
1
2
public float[] Frez => frez;
        public int[] Irez => irez;
ругается на => frez является поле а используется как тип.
C#
1
public ObservableCollection<str_pereval> List { get; private set; } = new ObservableCollection<str_pereval>();
ругается на = недопустимая лексема в объявлении класса, структуры или интерфейса.
Почему так ?
0
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
05.11.2015, 21:05
C# 6.0 (Visual Studio 2015)

C#
1
public float[] Frez => frez;
это синтаксический сахар, аналог:
C#
1
public float[] Frez { get { frez return frez; } }
А это инициализация свойства (тоже синтаксический сахар)
C#
1
public ObservableCollection<str_pereval> List { get; private set; } = new ObservableCollection<str_pereval>();
Просто перенесите инициализацию в конструктор
C#
1
2
3
4
5
6
public ObservableCollection<str_pereval> List { get; private set; }
 
public MainWindow()
{
     List = new ObservableCollection<str_pereval>();
}
1
 Аватар для Dostik
38 / 38 / 4
Регистрация: 31.05.2011
Сообщений: 580
05.11.2015, 23:14  [ТС]
Одна ошибка исправлена, спасибо, две нет :
C#
1
2
 public float[] Frez { get { frez return frez; } }
        public int[] Irez {get { irez return irez;}}
В качестве оператора могут использоваться только выражения присваивания, вызова, инкремента, декремента, ожидания и создания нового объекта
0
 Аватар для Konctantin
970 / 773 / 171
Регистрация: 12.04.2009
Сообщений: 1,700
06.11.2015, 07:13
{ get { frez return frez; } } очепятался я, { get { return frez; } }
1
 Аватар для Dostik
38 / 38 / 4
Регистрация: 31.05.2011
Сообщений: 580
06.11.2015, 07:56  [ТС]
Konctantin, Доброе утро, спасибо за ответ, компилятор не ругается, теперь ругается отладчик ...
Кликните здесь для просмотра всего текста
Необработанное исключение типа "System.Windows.Markup.XamlParseExceptio n" в PresentationFramework.dll

Дополнительные сведения: 'The invocation of the constructor on type 'WpfApplication1.MainWindow' that matches the specified binding constraints threw an exception.' Line number '6' and line position '9'.



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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
 
namespace WpfApplication1
{
    [StructLayout(LayoutKind.Sequential)]
    public class str_pereval
    {
        public int nk       { get; set; }
        public int N_vn     { get; set; }
        public int N_vv     { get; set; }
        public float d_vn   { get; set; }
        public float d_vv   { get; set; }
        public DateTime t_n { get; set; }
        public DateTime t_k { get; set; }
        public float L      { get; set; }
        public float P      { get; set; }
        public float Pm     { get; set; }
        public float Pp     { get; set; }
        public float kal_n  { get; set; }
        public float kal_v  { get; set; }
        public float res_v  { get; set; }
 
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
        private float[] frez;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
        private int[] irez;
 
        public float[] Frez {get{return  frez;}}
        public int[] Irez { get { return irez; } }
    };
 
    public partial class MainWindow : Window
    {
        public ObservableCollection<str_pereval> List { get; private set; } 
        public MainWindow()
        {
           List = new ObservableCollection<str_pereval>();
 
            InitializeComponent();
            DataContext = List;
            CommandBinding_Open_Executed(null, null);
        }
 
        private void CommandBinding_Open_Executed(object sender, ExecutedRoutedEventArgs e)
        {
            List.Clear();
            using (var reader = new BinaryReader(File.OpenRead("fpereval.dat")))
            {
                while (reader.BaseStream.Position != reader.BaseStream.Length)
                {
                    var obj = ReadStruct<str_pereval>(reader);
                    List.Add(obj);
                }
            }
        }
 
        private void CommandBinding_Save_Executed(object sender, ExecutedRoutedEventArgs e)
        {
            using (var writer = new BinaryWriter(File.Open("fpereval.dat", FileMode.Create)))
            {
                foreach (var obj in List)
                    WriteStruct(writer, obj);
                writer.Flush();
            }
        }
 
        private void CommandBinding_Close_Executed(object sender, ExecutedRoutedEventArgs e)
        {
            Application.Current.Shutdown();
        }
 
        T ReadStruct<T>(BinaryReader reader) where T : class, new()
        {
            byte[] rawData = reader.ReadBytes(Marshal.SizeOf(typeof(T)));
            GCHandle handle = GCHandle.Alloc(rawData, GCHandleType.Pinned);
            var returnObject = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T));
            handle.Free();
            return returnObject;
        }
 
        void WriteStruct<T>(BinaryWriter Writer, T value) where T : class, new()
        {
            int rawsize = Marshal.SizeOf(typeof(T));
            IntPtr buffer = Marshal.AllocHGlobal(rawsize);
            Marshal.StructureToPtr(value, buffer, false);
            byte[] rawdatas = new byte[rawsize];
            Marshal.Copy(buffer, rawdatas, 0, rawsize);
            Marshal.FreeHGlobal(buffer);
            Writer.Write(rawdatas);
        }
    }
}
0
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9674 / 4826 / 763
Регистрация: 17.04.2012
Сообщений: 9,664
Записей в блоге: 14
06.11.2015, 08:17
Цитата Сообщение от Dostik Посмотреть сообщение
The invocation of the constructor [...] threw an exception
Чтобы не получать такие странные ошибки, не помещайте код, который может бросить исключение, в конструктор.
Перенесите вызов CommandBinding_Open_Executed(null, null); в обработчик события, например, Initialized (или Loaded). Тогда можно будет увидеть исключение как оно есть.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.11.2015, 08:17

Чтение бинарного файла по заголовкам
Здравствуйте. Файл начинается так 00 00 00 00 FF FF 95 05 34 E8 02 00 CD 67 5A 41 первые 4 байта это номер записи потом 2 байта - номер...

Некорректное чтение из бинарного файла
Здравствуйте У меня следующая ситуация: 1) Создаю бинарный файл using (FileStream stream = new...

Чтение матрицы из бинарного файла
Здравствуйте. Необходимо считать матрицу с бинарного файла (расширение .dat ) где первые два элемента идут целые числа указывающие...

Чтение из бинарного файла в структуру
Совсем недавно начал изучать C# и .NET до этого программировал на C++. Хотел узнать можно ли через прямое обращение к памяти считать данные...

Чтение бинарного файла задом - наперед
Господа, мне необходимо прочесть бинарный файл задом на перед, то есть начинать читать байты не сверху вниз, а наоборот. Обычно я это...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы ## О чём эта статья В процессе построения ОДУ-модели (система дифференциальных. . .
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет) Содержание проекта Симуляция вековой (50 лет) экологической сукцессии в почве леса Основные участники: АМ-гриб, ЭКМ-гриб,. . .
сукцессия 23. Более физиологичная физиология, более экологичная экология, более диффурные диффуры.
anaschu 12.07.2026
Что реально нашли и починили за эти 5 часов Правило Линдемана (КПД конверсии сахара в тело, kEff) — раньше 100% полученного углерода шло прямо в биомассу гриба; теперь только kEff=0. 5 (после. . .
сукцессия 22. От артефактов к физиологии: калибровка агентной модели грибной сукцессии для воспроизведения сезонной динамики и pH-плато
anaschu 11.07.2026
Аннотация В данной работе представлена калибровка агентной модели динамики грибных сообществ (fungal-succession), направленная на устранение нефизичных артефактов (коллапс биомассы, мгновенное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru