Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
MayaNash
1291 / 459 / 50
Регистрация: 24.08.2011
Сообщений: 2,246
#1

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

18.07.2014, 18:16. Просмотров 374. Ответов 8
Метки нет (Все метки)

Есть такие вот типы данных:
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();
}
Списки заполняются верно, т.к. выводятся на экран и все с ними в порядке, всю программу выкладывать не хотелось бы. Процедура загрузки производит попытку чтения в начале программы, сохранение, естественно, перед выходом. При первом запуске все в порядке. Потом же происходит ошибка "Нарушение прав доступа при записи..." при выходе из программы. Почему?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.07.2014, 18:16
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Ошибка при записи или чтении в бинарный файл (C++):

Бинарный файл, ошибка при чтении символов - C++
Здравствуйте, нужна помощь. Среда MS VS 2013 "Ошибка при чтении символов", чтении происходит из бинарного файла. А вот что при выводе...

Ошибка при записи в бинарный файл - C++
Задание - записать в бинарный файл последовательность из N байт вида "00001111 11110000 00001111 ...". Почему-то 11110000 записывается...

Абракадабра при записи в файл и при чтении из него кириллицы - C++
#include <iostream> #include <fstream> using namespace std; int main() { ofstream f("text.dat"); f << "Тест"; ...

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

Баг при использовании класса string при записи в бинарный файл - C++
При записи в бинарный файл пользовательского класса, всё отлично отрабатывает, но, если в классе использовался класс string, то в конце...

Функция записи массива в бинарный файл - C++
Здравствуйте, если кто найдет ошибку - поправьте, желательно кодом, если лень - то скажите в какой строке ошибка и самое главное - в чем. ...

8
AlexVRud
472 / 184 / 50
Регистрация: 04.07.2014
Сообщений: 508
18.07.2014, 18:23 #2
String - это класс, и так с ним нельзя поступать ( те сохранять и читать), можешь задействовать массив чаров фиксированной длины. Тогда может и сработает.
0
ValeryS
Модератор
6963 / 5300 / 522
Регистрация: 14.02.2011
Сообщений: 17,876
18.07.2014, 18:23 #3
Цитата Сообщение от Керра Посмотреть сообщение
при выходе из программы. Почему?
потому что сохраняя
Цитата Сообщение от Керра Посмотреть сообщение
Nomer
да и другие указатели ты сохраняешь не содержимое памяти а указатель на неё(адрес)
при чтении этот адрес соответственно указывает "в космос"
0
MayaNash
1291 / 459 / 50
Регистрация: 24.08.2011
Сообщений: 2,246
18.07.2014, 18:29  [ТС] #4
ValeryS, так в эту функцию записи ж передается адрес начала и размер области памяти, а записывается же то что по этому адресу расположено
Почему при выходе из программы-то очевидно. Вопрос в том, какого фига ошибка происходит.

Добавлено через 52 секунды
AlexVRud, мерси, учту
0
ValeryS
Модератор
6963 / 5300 / 522
Регистрация: 14.02.2011
Сообщений: 17,876
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)
0
alsav22
5435 / 4830 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.07.2014, 19:40 #6
Цитата Сообщение от Керра Посмотреть сообщение
так в эту функцию записи ж передается адрес начала и размер области памяти, а записывается же то что по этому адресу расположено
Не пишут и не читают (без сериализации) string в бинарном режиме. Самой строки там может и не быть, а может и быть (зависит от реализации и от размера строки).
Совет 15. Помните о различиях в реализации string
0
MayaNash
1291 / 459 / 50
Регистрация: 24.08.2011
Сообщений: 2,246
18.07.2014, 21:20  [ТС] #7
ValeryS, считывается для удобства в обратном порядке, потому что порядок не имеет значения

alsav22, насчет стринг уже говорили, поняла
0
AlexVRud
472 / 184 / 50
Регистрация: 04.07.2014
Сообщений: 508
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 или другой, но фиксированный. А то у тебя структуры разные по длине могут получаться, в зависимости от архитектуры, ОС и компилятора.
1
MayaNash
1291 / 459 / 50
Регистрация: 24.08.2011
Сообщений: 2,246
19.07.2014, 13:58  [ТС] #9
AlexVRud, интересная штука, почитаю на хабре
Советы учту
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.07.2014, 13:58
Привет! Вот еще темы с ответами:

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

Ошибка при записи в файл - C++
помогите, вылетает ошибка при записи в файл ф-я void add_in_file(int n) что не так? #include <iostream> #include <conio.h> ...

Ошибки при записи и чтении из файла - C++
double calc(int n, double sum, int a, int b, double p, double f) { if(n == 0) return sum; else{ sum += p...

Ошибка при записи данных в файл - C++
Для записи перменной типа string выделяю динамически массив из 64 элементов char,после записи данных освобождаю память,но почему-то при...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru