Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/12: Рейтинг темы: голосов - 12, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 27.03.2018
Сообщений: 218
.NET 4.x

Чтение структур нескольких binary файлов

07.04.2019, 15:45. Показов 2696. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Интересен метод чтения нескольких binary файлов с разной структурой.
Желательно без serialize.
Я пробую сделать через имя файла.
Вот так код выглядит для одного файла.
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
public partial class MainWindow : Window
    {
        public int NameL { get; set; }
        public char[] Name { get; set; }
        public int CapitalL { get; set; }
        public char[] Capital { get; set; }
        public int Area { get; set; }
        public double Population { get; set; }
        public BindingList<CountryModel> data = new BindingList<CountryModel>();
 
        public MainWindow()
        {
            InitializeComponent();
        }
 
        private void MenuItem_Click(object sender, RoutedEventArgs e)
        {
            Close();
        }
 
        private void MenuItem_Click_1(object sender, RoutedEventArgs e)
        {
            var dlg = new OpenFileDialog
            {
                Filter = "Binary file (*.dat)|*.dat"
            };
            if (dlg.ShowDialog() == true)
            {
                PathFile.Text = dlg.FileName;
            }
            TestGrid.ItemsSource = data;
            string inputPath = dlg.FileName;
            using (BinaryReader reader = new BinaryReader(File.Open(inputPath, FileMode.Open, FileAccess.Read, FileShare.Read)))
            {
                while (reader.PeekChar() > -1)
                {                  
                    NameL = reader.ReadByte();
                    Name = reader.ReadChars(NameL);
                    CapitalL = reader.ReadByte();
                    Capital = reader.ReadChars(CapitalL);
                    Area = reader.ReadInt32();
                    Population = reader.ReadDouble();
                    string na = new string(Name);
                    string ca = new string(Capital);
                    data.Add(new CountryModel(na, ca, Area, Population));
                }
            }
        }
 
        private void MenuItem_Click_2(object sender, RoutedEventArgs e)
        {
            var dlg = new SaveFileDialog
            {
                Filter = "Binary file (*.dat)|*.dat"
            };
 
            if (dlg.ShowDialog() == true)
            {
                Save(dlg.FileName);
            }
        }
 
        private void Save(string outputPath)
        {
            BinaryWriter writer = new BinaryWriter(File.Open(outputPath, FileMode.Create));
            for (int i = 0; i < data.Count; i++)
            {
                writer.Write((byte)data[i].Name.Length);
                writer.Write(data[i].Name.ToCharArray());
                writer.Write((byte)data[i].Capital.Length);
                writer.Write(data[i].Capital.ToCharArray());
                writer.Write(data[i].Area);
                writer.Write(data[i].Population);
            }
            writer.Close();
        }
 
        private void MenuItem_Click_3(object sender, RoutedEventArgs e)
        {
            data.Add(new CountryModel("", "", 0, 0));
        }
    }
Сейчас создал вот такой атрибут.
C#
1
2
3
4
5
6
7
8
9
public class TestTableAttribute : Attribute
    {
        public string Name { get; set; }
 
        public TestTableAttribute(string name)
        {
            Name = name;
        }
    }
И добавил в модель
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[TestTable("testCountry")]
public class CountryModel
    {
        public string Name { get; set; } 
        public string Capital { get; set; }
        public int Area { get; set; }
        public double Population { get; set; }
 
        public string Hidden = ""; 
 
        public CountryModel(string name, string capital, int area, double population)
        {
            this.Name = name;
            this.Capital = capital;
            this.Area = area;
            this.Population = population;
        }
    }
Теперь вот вопрос, после переноса в модель чтения и сохранения.
Как мне заставить это работать в MainWindow.
Точнее сделать чтобы он смотрел на названия файла и по нему брал нужную мне структуру?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.04.2019, 15:45
Ответы с готовыми решениями:

Параллельное чтение и запись нескольких файлов
Нужно написать программу, которая параллельно копирует несколько файлов с помощью операций чтения/записи BinaryReader, BinaryWriter,...

Одновременное чтение и обработка данных из нескольких файлов, не помещающихся в память
Добрый день, форумчане. Прошу помощи в решении задачи. Задача состоит в том, что нужно обрабатывать несколько файлов с входными данными...

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

15
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
09.04.2019, 21:56
Непонятно зачем атрибут и где перенос чтения записи в модель
1
0 / 0 / 0
Регистрация: 27.03.2018
Сообщений: 218
09.04.2019, 22:17  [ТС]
Цитата Сообщение от nicolas2008 Посмотреть сообщение
Непонятно зачем атрибут и где перенос чтения записи в модель
ну в модель я перенес чтение и запись

а вот как сделать по имени файла чтобы он брал модель вообще не понял
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,569
09.04.2019, 23:14
Лучший ответ Сообщение было отмечено Irbos как решение

Решение

Может так?
Вложения
Тип файла: zip WpfApp1.zip (13.8 Кб, 3 просмотров)
1
0 / 0 / 0
Регистрация: 27.03.2018
Сообщений: 218
13.04.2019, 10:26  [ТС]
Цитата Сообщение от Someone007 Посмотреть сообщение
Может так?
Такая ошибка при сохранение
Миниатюры
Чтение структур нескольких binary файлов  
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,569
13.04.2019, 12:35
Цитата Сообщение от Irbos Посмотреть сообщение
Такая ошибка при сохранение
Код меняли?
0
0 / 0 / 0
Регистрация: 27.03.2018
Сообщений: 218
13.04.2019, 17:05  [ТС]
Нет, только начал изучать то что вы мне скинули
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,569
13.04.2019, 18:01
Да действительно я сломал код немного. Вот вроде рабочая версия.
Вложения
Тип файла: zip WpfApp1.zip (14.1 Кб, 2 просмотров)
0
0 / 0 / 0
Регистрация: 27.03.2018
Сообщений: 218
13.04.2019, 20:14  [ТС]
Цитата Сообщение от Someone007 Посмотреть сообщение
Да действительно я сломал код немного. Вот вроде рабочая версия.
Спасибо, ещё такой вопрос возник.
Как сделать так чтобы он последнее пустую строчку не сохранял)
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,569
13.04.2019, 20:41
Цитата Сообщение от Irbos Посмотреть сообщение
Как сделать так чтобы он последнее пустую строчку не сохранял)
А она сохраняется? По идее не должна, но я не проверял...

Глянул сохраненный файл, там нет данных из последней пустой строки...
0
0 / 0 / 0
Регистрация: 27.03.2018
Сообщений: 218
13.04.2019, 20:53  [ТС]
Цитата Сообщение от Someone007 Посмотреть сообщение
А она сохраняется? По идее не должна, но я не проверял...
Глянул сохраненный файл, там нет данных из последней пустой строки...
Я сохранил с добавленной строчкой, потом пытаюсь открыть и он пишет
Открываю в hex и последняя строчка заполнена нулями.....
Миниатюры
Чтение структур нескольких binary файлов  
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,569
13.04.2019, 21:11
Лучший ответ Сообщение было отмечено Irbos как решение

Решение

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

А то, что последняя строчка нулями заполнена, у меня такого нет. Вы случайно не пытались её редактировать перед сохранением? Возможно в этом причина.
Миниатюры
Чтение структур нескольких binary файлов  
1
0 / 0 / 0
Регистрация: 27.03.2018
Сообщений: 218
13.04.2019, 21:19  [ТС]
Цитата Сообщение от Someone007 Посмотреть сообщение
Пишет правильно, имя файла должно совпадать со значением атрибута, вы же сами этого хотели.
А то, что последняя строчка нулями заполнена, у меня такого нет. Вы случайно не пытались её редактировать перед сохранением? Возможно в этом причина.
Да мой косяк, спасибо большое за помощь
Переработал и не могу адекватно читать код.
Ещё раз спасибо за помощь
0
0 / 0 / 0
Регистрация: 27.03.2018
Сообщений: 218
17.06.2019, 23:46  [ТС]
Возникла кое-какая проблема
После того как я решил попробовать этот метод в с другими файлами появилась одна проблема.
Он стал показывать только последнею запись.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[Table("eventmanagement")]
    public class EventManager_Table : IBinaryTable, IBinaryTable<EventManager>
    {
        public BindingList<EventManager> Data { get; } = new BindingList<EventManager>();
 
        public void Load(BinaryReader reader)
        {
            while (reader.BaseStream.Position != reader.BaseStream.Length)
            {
                var rec = new EventManager();
                rec.Read(reader);
                Data.Add(rec);
            }
        }
 
        public void Save(BinaryWriter writer)
        {
            foreach (var rec in Data)
                rec.Write(writer);
        }
    }
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
public class EventManager : IBinaryRecord
    {
        public int CountEvent;
        public short EventNo { get; set; }
        public string EventName { get; set; }
        public string Condition { get; set; }
        public string SettedEvent { get; set; }
        public void Read(BinaryReader reader)
        {
            CountEvent = reader.ReadInt32();
            for (int i = 0; i < CountEvent; i++)
            {
                EventNo = reader.ReadInt16();
                var eventNameL = reader.ReadInt64();
                var eventNameC = reader.ReadChars((int)eventNameL);
                EventName = new string(eventNameC);
                var ConditionL = reader.ReadInt64();
                var ConditionC = reader.ReadChars((int)ConditionL);
                Condition = new string(ConditionC);
                var SettedEventL = reader.ReadInt64();
                var SettedEventC = reader.ReadChars((int)SettedEventL);
                SettedEvent = new string(SettedEventC);
                byte unk2 = reader.ReadByte();
            }
            byte[] unkByte = reader.ReadBytes(9486);
        }
 
        public void Write(BinaryWriter writer)
        {
        }
    }
Миниатюры
Чтение структур нескольких binary файлов  
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,569
17.06.2019, 23: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
[Table("eventmanagement")]
    public class EventManager_Table : IBinaryTable, IBinaryTable<EventManager>
    {
        public BindingList<EventManager> Data { get; } = new BindingList<EventManager>();
 
        public void Load(BinaryReader reader)
        {
            int count = reader.ReadInt32();
            for (int i = 0; i < count; i++)
            {
                var rec = new EventManager();
                rec.Read(reader);
                Data.Add(rec);
            }
            byte[] unkByte = reader.ReadBytes(9486);
        }
 
        public void Save(BinaryWriter writer)
        {
            foreach (var rec in Data)
                rec.Write(writer);
        }
    }
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
public class EventManager : IBinaryRecord
    {
        public int CountEvent;
        public short EventNo { get; set; }
        public string EventName { get; set; }
        public string Condition { get; set; }
        public string SettedEvent { get; set; }
        public void Read(BinaryReader reader)
        {
                EventNo = reader.ReadInt16();
                var eventNameL = reader.ReadInt64();
                var eventNameC = reader.ReadChars((int)eventNameL);
                EventName = new string(eventNameC);
                var ConditionL = reader.ReadInt64();
                var ConditionC = reader.ReadChars((int)ConditionL);
                Condition = new string(ConditionC);
                var SettedEventL = reader.ReadInt64();
                var SettedEventC = reader.ReadChars((int)SettedEventL);
                SettedEvent = new string(SettedEventC);
                byte unk2 = reader.ReadByte();
        }
 
        public void Write(BinaryWriter writer)
        {
        }
    }
1
0 / 0 / 0
Регистрация: 27.03.2018
Сообщений: 218
17.06.2019, 23:58  [ТС]
Цитата Сообщение от Someone007 Посмотреть сообщение
Потому что вы неправильно реализовали чтение... Тут похоже надо было немного по другому поступить...
И вообще структура какая-то странная, вы точно её правильно поняли? Мне кажется что должно быть что-то типа этого...
Что-то типа этого...
Спасибо, я думал на счёт такого варианта, но что то меня спугнуло так попробовать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.06.2019, 23:58
Помогаю со студенческими работами здесь

Чтение из нескольких файлов
Добрый день,помогите с решением,обьясню что я хочу реализовать. Выбираю из выбрантов файл 1,2 или 3,но вот в чём проблема. При выборе...

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

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

Чтение нескольких файлов с данными в массив
В процессе освоения Мatlab, подскажите как прочитать список файлов в один массив ? fidZ=fopen('c:\ZZZ.001','rb'); ...

Циклическое чтение данных из нескольких файлов .txt
Здравствуйте, уважаемые форумчане. Подскажите пожалуйста по следующей проблеме, так в интернете похожего ничего не нашел. Задача: имеется...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
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 - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru