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

Недопустимый двоичный формат входного потока

16.12.2016, 01:22. Показов 5962. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет! Возникла такая ошибка: "Недопустимый двоичный формат входного потока."
В чем может быть проблема? Вот код:
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
namespace pr
{
    [Serializable]
    class logic
    {
        StringBuilder organisation;
        StringBuilder telephone;
        StringBuilder contact;
        StringBuilder adress;
 
        public logic()
        {
            organisation = new StringBuilder("ГАЗПРОМ", 80);
            adress = new StringBuilder("улица Руставелли",100);
            telephone = new StringBuilder("88006005050", 11);
            contact = new StringBuilder("www.bbb.com", 100);
        }
 
        public logic(string organisation, string adress, string telephone, string contact)
        {
            this.organisation = new StringBuilder(organisation, 80);
            this.adress = new StringBuilder(adress, 100);
            this.telephone = new StringBuilder(telephone, 11);
            this.contact = new StringBuilder(contact, 100);
        }
 
        public void AddToFile(string path)
        {
            FileStream f = new FileStream(path, FileMode.Append);
            BinaryFormatter bw = new BinaryFormatter();
            bw.Serialize(f, this, null);
            f.Close();
        }
 
        public static string Show(string path)
        {
            BinaryFormatter formatter = new BinaryFormatter();
            string ans = "";
 
            using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate))
            {
                while (fs.Position < fs.Length)
                {
                    logic newLogic = (logic)formatter.Deserialize(fs);
                    ans += newLogic.organisation + "," +newLogic.adress+","+ newLogic.telephone + "," + newLogic.contact + "," + "";
                }
            }
            return ans;
        }
        public long find(string path)
        {
            BinaryFormatter formatter = new BinaryFormatter();
            using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate))
            {
                while (fs.Position < fs.Length)
                {
                    long pos = fs.Position;
                    logic newLogic = (logic)formatter.Deserialize(fs);
                    if (newLogic.organisation.Equals(this.organisation))
                        return pos;
                }
            }
            return -1;
        }
        public void correct(string path, long pos)
        {
            BinaryFormatter formatter = new BinaryFormatter();
            using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate))
            {
                fs.Seek(pos, SeekOrigin.Begin);
                formatter.Serialize(fs, this, null);
            }
        }
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.12.2016, 01:22
Ответы с готовыми решениями:

Очистка входного потока
Здравствуйте уважаемые! Пишу игрушку на C#, возникла проблема: в одном месте (в меню выбора...

Прочитать все из входного потока
Начал учиться программировать на c#, решая задачки на сайте олимпиадного программирования. Сразу же...

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

Слова входного потока
Вывести самые длинные слова входного потока! если во вх потоке самое длинное слово одно,то...

7
Администратор
Эксперт .NET
17552 / 13775 / 5298
Регистрация: 17.03.2014
Сообщений: 28,253
Записей в блоге: 1
16.12.2016, 01:57 2
Lenster, подозреваю что проблема возникает после вызова метода correct(). Кол-во байтов в новом объекте не обязано совпадать с кол-вом байтов в старом - их может быть как меньше так и больше. В первом случае получатся новые байты плюс хвост от старых. Во втором будут перезаписаны часть байтов следующего объекта. И затем в обоих случаях при попытке чтения мы получим исключение. Нужно а) заменить stringbuilder на char[] фиксированного размера (который никогда нельзя будет менять) или б) читать все объекты которые идут начиная с текущей позиции, делать truncate файла на начальной позиции, сериализовать новый объект и затем объекты которые идут после него или в) придумать другой подход для хранения данных - например обычный архив где имя файла это имя организации.
1
0 / 0 / 0
Регистрация: 23.01.2016
Сообщений: 35
16.12.2016, 11:52  [ТС] 3
Замена stringbuilder на char[] не помогла. Ошибку выдает в строке:
C#
1
logic newLogic = (logic)formatter.Deserialize(fs);
Ошибки, как оказалось, две:
1.Двоичный поток "0" не содержит допустимого двоичного заголовка BinaryHeader. Возможные причины: недопустимый поток или изменение версии объекта между сериализацией и десериализацией.
2.Недопустимый двоичный формат входного потока. Начало содержимого (в байтах): 00-00-0B-00-01-00-00-00-FF-FF-FF-FF-01-00-00-00-00 ...
Также жалуется на, видимо, слишком большие значения fs.Length и fs.Position
0
Администратор
Эксперт .NET
17552 / 13775 / 5298
Регистрация: 17.03.2014
Сообщений: 28,253
Записей в блоге: 1
16.12.2016, 17:03 4
Цитата Сообщение от Lenster Посмотреть сообщение
Замена stringbuilder на char[] не помогла.
Файл наверное старый используешь.
0
0 / 0 / 0
Регистрация: 23.01.2016
Сообщений: 35
16.12.2016, 18:22  [ТС] 5
Я изменил код, старые ошибки пропали, но появилась новая: Ссылка на объект не указывает на экземпляр объекта.
Как ее решить? Вот мой код:
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
    [Serializable]
    class logic
    {
        private char[] organisation = new char[20];
        private char[] telephone = new char[20];
        private char[] contact = new char[20];
        private char[] adress = new char[20];
        public logic(string organisation, string telephone, string contact, string adress)
        {
            perevod(organisation, this.organisation);
            perevod(telephone, this.telephone);
            perevod(contact, this.contact);
            perevod(adress, this.adress);
        }
        static void perevod(string n, char[] b)
        {
            for (int i = 0; i < 20; i++)
            {
                if (i < n.Length)
                    b[i] = Convert.ToChar(n[i]);
                else b[i] = '\0';
            }
        }
        static string plus(char[] b)
        {
            string rez = "";
            for (int i = 0; i < b.Length; i++)
            {
                if (b[i] == '\0') { }
                else rez += Convert.ToString(b[i]);
            }
            return rez;
        }
 
        public void AddToFile(string path) // записывает в файл с путем path этот объект
        {
            FileStream f = new FileStream(path, FileMode.Append);
            BinaryFormatter bw = new BinaryFormatter();
            bw.Serialize(f, this, null);
            f.Close();
        }
 
        public static string Show(string path) // возвращает строку со всеми значениями из файла с путем path
        {
            BinaryFormatter formatter = new BinaryFormatter();
            string ans = "";
            // десериализация из файла path
 
            using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate))
            {
                while (fs.Position < fs.Length)
                {
                    logic newLogic = (logic)formatter.Deserialize(fs);
                    ans += plus(newLogic.organisation) + "," + plus(newLogic.adress) + "," + plus(newLogic.telephone) + "," + plus(newLogic.contact) + "," + "";
                }
            }
            return ans;
        }
        public long find(string path) // ищет в файле с путем path необходимую организацию и возвращает указатель
        {
            BinaryFormatter formatter = new BinaryFormatter();
            using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate))
            {
                while (fs.Position < fs.Length)
                {
                    long pos = fs.Position;
                    logic newLogic = (logic)formatter.Deserialize(fs);
                    if (newLogic.organisation.Equals(this.organisation))
                        return pos;
                }
            }
            return -1;
        }
        public void correct(string path, long pos) // изменяет запись по указателю в файле с путем path
        {
            BinaryFormatter formatter = new BinaryFormatter();
            using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate))
            {
                fs.Seek(pos, SeekOrigin.Begin);
                formatter.Serialize(fs, this, null);
            }
        }
    }
0
Администратор
Эксперт .NET
17552 / 13775 / 5298
Регистрация: 17.03.2014
Сообщений: 28,253
Записей в блоге: 1
17.12.2016, 00:22 6
Lenster, место ошибки предлагается угадать или ты раскроешь страшную тайну?
0
0 / 0 / 0
Регистрация: 23.01.2016
Сообщений: 35
17.12.2016, 22:12  [ТС] 7
Ошибка в строке 27:
C#
1
for (int i = 0; i < b.Length; i++)
Жалуется именно на "i < b.Length"
0
Администратор
Эксперт .NET
17552 / 13775 / 5298
Регистрация: 17.03.2014
Сообщений: 28,253
Записей в блоге: 1
17.12.2016, 22:23 8
Lenster, что я могу сказать - значит переменная b имеет значение null. Думай почему.
0
17.12.2016, 22:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.12.2016, 22:23
Помогаю со студенческими работами здесь

Проверка входного потока на ошибки
Ребяты подскажите плз )))) сам не как не разберусь можно ли использовать failbit badbit goodbit...

Работа стандартного входного потока
Здравствуйте. Допустим есть код: int number1, number2; std::cin &gt;&gt; number1 &gt;&gt; number2; Мы...

Копирование входного потока в выходной
Нужна помощь по этому вопросу. Непонимаю как именно это все происходит. Т.к. с отладчиком пока не...

Получение информации из входного потока
Привет участвую в олимпиаде, нужно взять информацию из потока: входные данные 5 tourist...


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

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