Форум программистов, компьютерный форум CyberForum.ru

Ошибка при записи или чтении в бинарный файл - C++

Восстановить пароль Регистрация
 
Керра
Модератор
 Аватар для Керра
1270 / 438 / 45
Регистрация: 24.08.2011
Сообщений: 2,123
18.07.2014, 18:16     Ошибка при записи или чтении в бинарный файл #1
Есть такие вот типы данных:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
struct Nomer
{
    int n, tsena1Deni;
    string klass;
    int kMest, kZaselenii;
    bool svoboden;
    Nomer *sled;
};
 
struct Gosti
{
    string f, i, o, strana, pasport, dRojdenia, dPriezda, dOtiezda;
    int nomer;
    Gosti *sled;
};
 
struct God
{
    int g;
    unsigned long long pribyli;
    God *sled;
};
И такие вот процедуры загрузки и сохранения:
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
bool Zagruziti(Nomer *&n, Gosti *&g, God *&goda, int &sv)
{
    n = NULL, g = NULL, goda = NULL, sv = 0;
 
    ifstream f("C:\\nomera.inf", ios_base::binary);
    if (!f.is_open())
        return false;
    {
        Nomer *novyi;
        while (!f.eof())
        {
            novyi = new Nomer;
            f.read((char*)novyi, sizeof(*novyi));
            if (novyi->svoboden)
                sv++;
            novyi->sled = n;
            n = novyi;
        }
    }
    f.close();
    f.open("C:\\gosti.inf", ios_base::binary);
    {
        Gosti *novyi;
        while (!f.eof())
        {
            novyi = new Gosti;
            f.read((char*)novyi, sizeof(*novyi));
            novyi->sled = g;
            g = novyi;
        }
    }
    f.close();
    f.open("C:\\goda.inf", ios_base::binary);
    {
        God *posled;
        while (!f.eof())
        {
            if (goda == NULL)
            {
                goda = new God;
                posled = goda;
            }
            else
            {
                posled->sled = new God;
                posled = posled->sled;
            }
            f.read((char*)posled, sizeof(*posled));
        }
        if (goda != NULL)
            posled->sled = NULL;
    }
    f.close();
    return true;
}
 
void Sohraniti(Nomer *n, Gosti *g, God *goda)
{
    ofstream f("C:\\nomera.inf", ios_base::binary);
    for (Nomer *tek = n; tek != NULL; tek = tek->sled)
        f.write((char*)tek, sizeof(*tek));
    f.close();
    f.open("C:\\gosti.inf", ios_base::binary);
    for (Gosti *tek = g; tek != NULL; tek = tek->sled)
        f.write((char*)tek, sizeof(*tek));
    f.close();
    f.open("C:\\goda.inf", ios_base::binary);
    for (God *tek = goda; tek != NULL; tek = tek->sled)
        f.write((char*)tek, sizeof(*tek));
    f.close();
}
Списки заполняются верно, т.к. выводятся на экран и все с ними в порядке, всю программу выкладывать не хотелось бы. Процедура загрузки производит попытку чтения в начале программы, сохранение, естественно, перед выходом. При первом запуске все в порядке. Потом же происходит ошибка "Нарушение прав доступа при записи..." при выходе из программы. Почему?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.07.2014, 18:16     Ошибка при записи или чтении в бинарный файл
Посмотрите здесь:

C++ ошибка при записи в файл.
C++ Ошибка при записи в файл
C++ Ошибка при записи данных в файл
Ошибка при чтении/записи из бинарного файла C++
C++ Ошибки при записи и чтении из файла
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
AlexVRud
413 / 142 / 36
Регистрация: 04.07.2014
Сообщений: 413
18.07.2014, 18:23     Ошибка при записи или чтении в бинарный файл #2
String - это класс, и так с ним нельзя поступать ( те сохранять и читать), можешь задействовать массив чаров фиксированной длины. Тогда может и сработает.
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
18.07.2014, 18:23     Ошибка при записи или чтении в бинарный файл #3
Цитата Сообщение от Керра Посмотреть сообщение
при выходе из программы. Почему?
потому что сохраняя
Цитата Сообщение от Керра Посмотреть сообщение
Nomer
да и другие указатели ты сохраняешь не содержимое памяти а указатель на неё(адрес)
при чтении этот адрес соответственно указывает "в космос"
Керра
Модератор
 Аватар для Керра
1270 / 438 / 45
Регистрация: 24.08.2011
Сообщений: 2,123
18.07.2014, 18:29  [ТС]     Ошибка при записи или чтении в бинарный файл #4
ValeryS, так в эту функцию записи ж передается адрес начала и размер области памяти, а записывается же то что по этому адресу расположено
Почему при выходе из программы-то очевидно. Вопрос в том, какого фига ошибка происходит.

Добавлено через 52 секунды
AlexVRud, мерси, учту
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,043
18.07.2014, 18:49     Ошибка при записи или чтении в бинарный файл #5
Цитата Сообщение от Керра Посмотреть сообщение
ValeryS, так в эту функцию записи ж передается адрес начала и размер области памяти,
посмотри как распределяются указатели
Цитата Сообщение от Керра Посмотреть сообщение
for (Nomer *tek = n; tek != NULL; tek = tek->sled)
* * * * f.write((char*)tek, sizeof(*tek));
записываем сначала первый, потом на который указывает потом еще на который указывает
а считываем?
Цитата Сообщение от Керра Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
 while (!f.eof())
        {
            novyi = new Nomer;
            f.read((char*)novyi, sizeof(*novyi));
            if (novyi->svoboden)
                sv++;
            novyi->sled = n;
            n = novyi;
        }
создаем элемент
и указатель на NULL
потом еще создаем элемент и указатель на первый
что то я не могу врубится
да и стринг это тоже указатель

а зачем ты к (char*) приводишь?
да и sizeof(*novyi)?
не проще
C++
1
sizeof(Nomer)
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.07.2014, 19:40     Ошибка при записи или чтении в бинарный файл #6
Цитата Сообщение от Керра Посмотреть сообщение
так в эту функцию записи ж передается адрес начала и размер области памяти, а записывается же то что по этому адресу расположено
Не пишут и не читают (без сериализации) string в бинарном режиме. Самой строки там может и не быть, а может и быть (зависит от реализации и от размера строки).
Совет 15. Помните о различиях в реализации string
Керра
Модератор
 Аватар для Керра
1270 / 438 / 45
Регистрация: 24.08.2011
Сообщений: 2,123
18.07.2014, 21:20  [ТС]     Ошибка при записи или чтении в бинарный файл #7
ValeryS, считывается для удобства в обратном порядке, потому что порядок не имеет значения

alsav22, насчет стринг уже говорили, поняла
AlexVRud
413 / 142 / 36
Регистрация: 04.07.2014
Сообщений: 413
19.07.2014, 09:36     Ошибка при записи или чтении в бинарный файл #8
Еще замечания: для таких структур важно указывать выравнивание
C++
1
2
3
4
5
6
#pragma pack(push, 1)
struct Foo
{
    // ...
};
#pragma pack(pop)
Тип int замени на более конкретный int32_t или другой, но фиксированный. А то у тебя структуры разные по длине могут получаться, в зависимости от архитектуры, ОС и компилятора.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.07.2014, 13:58     Ошибка при записи или чтении в бинарный файл
Еще ссылки по теме:

C++ Ошибка при записи в бинарный файл
C++ Абракадабра при записи в файл и при чтении из него кириллицы
C++ Выход при неудачном чтении/записи файла

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

Или воспользуйтесь поиском по форуму:
Керра
Модератор
 Аватар для Керра
1270 / 438 / 45
Регистрация: 24.08.2011
Сообщений: 2,123
19.07.2014, 13:58  [ТС]     Ошибка при записи или чтении в бинарный файл #9
AlexVRud, интересная штука, почитаю на хабре
Советы учту
Yandex
Объявления
19.07.2014, 13:58     Ошибка при записи или чтении в бинарный файл
Ответ Создать тему
Опции темы

Текущее время: 14:47. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru