2 / 2 / 0
Регистрация: 13.03.2016
Сообщений: 18
1

Вылет при чтении из бинарного файла

25.04.2016, 18:41. Показов 1170. Ответов 8
Метки нет (Все метки)

Уважаемые товарищи, пожалуйста, помогите понять почему приведённые ниже функции, записывающие или читающие бинарный файл, работают или не работают в зависимости от длины информационного поля name типа string.

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
struct Node
{
    string name;
    string number;
    string group;
    double ball;
    Node *left;
    Node *right;
};
 
typedef Node *PNode;
 
PNode Load_from_Bin(int &k)
{
 
    ifstream f("tree.dat", ios::binary);
    PNode q = new Node, Tree = 0;
    if (f.is_open())
        while (!f.eof())
        {
            f.read((char*)q, sizeof(Node));
            if (!f.eof())
            {
                cout << q->name<<endl;
                AddToTree(Tree, q->name, q->number, q->group, q->ball);
                k++;
            }
        }
    else
        cout << "\n Файл «tree.dat» не найден\n";
    f.close();
    return Tree;
 
void Save_in_Bin(PNode Tree, ofstream &f)
{
    if (Tree)
    {
        PNode q = new Node;
        Save_in_Bin(Tree->left, f);
        f.write((char*)q, sizeof(q));
        Save_in_Bin(Tree->right, f);
    }
}
 
}
Вот, проблема в том, что запись в бинарный файл и чтение в бинарный файл работают только тогда, когда информационное поле name короткое. А если я записываю туда фамилию, имя и отчество, то всегда вылетает.

Добавлено через 1 минуту
Прошу прощения. Сильно торопился. Название темы должно было быть: "Вылет при чтении из бинарного файла"
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.04.2016, 18:41
Ответы с готовыми решениями:

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

Ошибка при чтении бинарного файла
почему у меня выводит два раза последнюю запись при чтении??(а файл записываю класс с 3...

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

Ошибка при чтении/записи из бинарного файла
Сделал простую программу для работы с бинарными файлами, но когда запускаю ее вылетает ошибка....

8
7362 / 6284 / 2856
Регистрация: 14.04.2014
Сообщений: 27,223
25.04.2016, 18:46 2
Лучший ответ Сообщение было отмечено Кросс как решение

Решение

Потому что программа у тебя неправильная. Ты указываешь размер указателя, а не структуры при записи. Но даже если бы указывал правильно, то всё равно твою структуру так не запишешь. Нужно каждое поле string отдельно записывать: длину и содержимое. Много раз обсуждали это.
0
2 / 2 / 0
Регистрация: 13.03.2016
Сообщений: 18
25.04.2016, 19:00  [ТС] 3
f.write((char*)q, sizeof(q)); на f.write((char*)q, sizeof(Node)) исправил уже. А без постоянной записи длины обойтись нельзя?
0
7362 / 6284 / 2856
Регистрация: 14.04.2014
Сообщений: 27,223
25.04.2016, 19:06 4
Ну а как ты потом считывать будешь? Текст же разной длины может быть, как узнать сколько байт извлечь без длины?
Цитата Сообщение от Кросс Посмотреть сообщение
исправил уже
Это не поможет, string в индивидуальном порядке записывать.
0
2 / 2 / 0
Регистрация: 13.03.2016
Сообщений: 18
25.04.2016, 19:10  [ТС] 5
То есть остаётся только, или постоянно записывать длину, или использовать статические массивы?
0
7362 / 6284 / 2856
Регистрация: 14.04.2014
Сообщений: 27,223
25.04.2016, 19:24 6
Да. Только со статическими массивами ты будешь записывать неиспользуемые байты.
0
44 / 44 / 12
Регистрация: 05.04.2015
Сообщений: 345
25.04.2016, 19:27 7
Или использовать готовые классы для этого. Один из вариантов QDataStream из Qt.
0
2 / 2 / 0
Регистрация: 13.03.2016
Сообщений: 18
25.04.2016, 19:28  [ТС] 8
А с текстовыми файлами почему-то всё работает нормально

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
PNode Load_from_TXT(int &k)
{
    PNode Tree = 0;
    string name, name2, number, group;
    double ball;
    ifstream f("tree.txt");
    if (!f)
        cout << "\n Файл отсутствует\n";
    else
        while (!f.eof())
        {
            f >> name;
            if (!f.eof())
            {
                f >> name2;
                name += ' ' + name2;
                f >> name2;
                name += ' ' + name2;
                /*cout << "Имя: " << name << endl;*/
                f >> number;
                /*cout << "Номер: " << number << endl;*/
                f >> group;
                /*cout << "Группа: " << group << endl;*/
                f >> ball;
                /*cout << "Балл: " << ball << endl;*/
                AddToTree(Tree, name, number, group, ball);
                k++;
            }
        }
    return Tree;
}
 
void Save_in_TXT(PNode Tree, ofstream &f)
{
    if (Tree)
    {
        Save_in_TXT(Tree->left, f);
        f << Tree->name << endl << Tree->number << endl << Tree->group << endl << Tree->ball << endl;
        Save_in_TXT(Tree->right, f);
    }
}
0
7362 / 6284 / 2856
Регистрация: 14.04.2014
Сообщений: 27,223
25.04.2016, 19:32 9
Потому что есть разделитель - конец строки.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.04.2016, 19:32
Помогаю со студенческими работами здесь

Почему при чтении бинарного файла происходит экстренное завершение программы?
в Windows XP при чтение бинарного файла происходит екстренное завершение программы !!! /*Writing...

Ошибка при чтении записи строки и вылет в другой код
Все работало хорошо, но вдруг что-то пошло не так и при чтении из файла в массив чаров вылетает в...

Ошибка при чтении бинарного файла
пытаюсь прочитать 63мб бинарного файла и заполнить структуру к примеру вот std::fstream...

Нечастые крякозябры при чтении из бинарного файла
Вообщем читаю строки с бинарника и вылазит строки например жирафа(верхнее)@ тигр(нижнеее)@...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru