Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/70: Рейтинг темы: голосов - 70, средняя оценка - 4.81
0 / 0 / 0
Регистрация: 09.01.2012
Сообщений: 14
1

Запись в бинарный файл, его чтение и редактирование

23.03.2012, 21:13. Показов 14012. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, возникла проблема с записью данных в бинарный файл.
Есть некая структура, по которой читается файл, эти данные выводятся в dataGridView с возможностью редактирования, и есть сохранение этих изменённых данных.

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

Собственно сам код:
1)Чтение файла
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int counts;
string filePath = "";
char[] header = new char[4];
 
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
    filePath = openFileDialog1.FileName.ToString();
}
 
using (var br = new BinaryReader(File.Open(filePath, FileMode.Open, FileAccess.Read)))
{
     header = br.ReadChars(4);
     counts = br.ReadInt32();
 
      for (int i = 0; i < counts; i++)
        {
            dod.id = br.ReadInt32();
            dod.length = br.ReadInt32();
            dod.path = Encoding.Default.GetString(br.ReadBytes(dod.length));
 
            objects.Add(dod);
        }
}
2)Сохранение файла
C#
1
2
3
4
5
6
7
8
9
10
BinaryWriter bw = new BinaryWriter(File.Open("C:\\daq.dat", FileMode.Create));
 
bw.Write(header);
 
for (int i = 0; i < counts; i++)
{
      bw.Write(objects[i].id);
      bw.Write(objects[i].length);
      bw.Write(objects[i].path);
}
3)Хранение данных
C#
1
2
3
4
5
6
7
8
9
public struct dynamicObjectsData
{
    public int id;
    public int length;
    public string path;
};
 
List<dynamicObjectsData> objects = new List<dynamicObjectsData>();
dynamicObjectsData dod = new dynamicObjectsData();
Во вложении структура файла, и сам файл.
Буду благодарен за любую помощь, или подсказку.
Вложения
Тип файла: rar data.rar (1.2 Кб, 122 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.03.2012, 21:13
Ответы с готовыми решениями:

Чтение/запись дерева в текстовый и бинарный файл
Есть базовый класс и 2 наследника.Реализовано дерево указателей на базовый класс.Как реализовать...

Чтение, редактирование и запись в .doc файл
у меня совсем небольшой опыт программирования, поэтому прошу помощи... нужно открыть .doc файл,...

Запись массива структур в бинарный файл и считывание его
Есть такая структура: struct table { public string name; public string...

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

4
32 / 32 / 1
Регистрация: 16.07.2009
Сообщений: 84
24.03.2012, 00:14 2
Есть предположение, что из-за того, что не пишем в файл Counts.
Т.е. добавить

C#
1
2
bw.Write(header);
bw.Write(counts);
1
0 / 0 / 0
Регистрация: 09.01.2012
Сообщений: 14
24.03.2012, 13:53  [ТС] 3
Проблему решил, оказывается в файле была кодировка (936).
Собственно изменил следующее:
1)Чтение файла:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int counts;
string filePath = "";
char[] header = new char[4];
 
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
    filePath = openFileDialog1.FileName.ToString();
}
 
using (var br = new BinaryReader(File.Open(filePath, FileMode.Open, FileAccess.Read)))
{
     header = br.ReadChars(4);
     counts = br.ReadInt32();
 
      for (int i = 0; i < counts; i++)
        {
            dod.id = br.ReadInt32();
            dod.length = br.ReadInt32();
            dod.path = Encoding.GetEncoding(936).GetString(br.ReadBytes(dod.length));
 
            objects.Add(dod);
        }
}
Тем самым файл прочитан и сохранён в буфере правильно.
2)Сохранение файла
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using (var bw = new BinaryWriter(File.Open("C:\\daq.data", FileMode.Create),
Encoding.GetEncoding(936)))
{
       bw.Write(header);
       bw.Write(counts);
 
       for (int i = 0; i < counts; i++)
         {
              bw.Write(objects[i].id);
              bw.Write(objects[i].length);
                 for(int j = 0; j < objects[i].path.Length; j++ )
                   {
                       bw.Write(objects[i].path[j]);
                   }              
          }
}
Добавил второй цикл который записывает строку посимвольно, т.к. при записи целой строки появлялись неизвестные символы.
Добавить запись количества элементов, по подсказке Enoa, за что ему огромное спасибо.
И добавил, что при записи в файл, всё кодируется в кодировку (936).
0
32 / 32 / 1
Регистрация: 16.07.2009
Сообщений: 84
24.03.2012, 18:59 4
В конструкторе BinaryReader есть параметр encoding. А что, если задать его по default?

C#
1
using (var br = new BinaryReader(File.Open(filePath, FileMode.Open, FileAccess.Read), Encoding.Default))
0
0 / 0 / 0
Регистрация: 09.01.2012
Сообщений: 14
24.03.2012, 22:00  [ТС] 5
Encoding.Default, у меня был UTF-8.
0
24.03.2012, 22:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.03.2012, 22:00
Помогаю со студенческими работами здесь

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

Запись в бинарный файл
Доброго дня. Есть файл в который записываются некоторый массив байт, допустим файл такой: Если...

Шифровка данных (чтение/запись/редактирование) в программе хранения паролей
Доброго всем. Написал программку (т.к я самоучка и много еще не знаю, написал как смог) программа ...

Считывание и запись в бинарный файл
Как записать в двоичный файл, а затем считать и записать в коллекцию? Мои наработки, может...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru