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

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

Войти
Регистрация
Восстановить пароль
 
 
TheStigger
0 / 0 / 0
Регистрация: 16.05.2014
Сообщений: 14
#1

Ошибка "Попытка чтения в запрещенную память" при работе с файлами - C++

16.05.2014, 23:22. Просмотров 575. Ответов 15
Метки нет (Все метки)

Нужно хранить в файле данные со структуры и считывать их.
Перепробовал кучу вариантов (fopen и ofstream/ifstream), постоянно одна и та же ошибка.
"Необработанное исключение типа "System.AccessViolationException" в CourseWork1.exe
Дополнительные сведения: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена."
Пробовал сделать тоже с обычной строкой, все равно ошибка. Ниже приведу код части программы
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
...
string testchar;
...
//Главная форма
    private: System::Void MyForm_Load(System::Object^  sender, System::EventArgs^  e) {
                 testchar = "hello";
                 ExportToFile2();
                 ImportFromFile2();
 
void ExportToFile2(void)
    {
        FILE  *fp;
        register int i;
        if ((fp = fopen("cash", "ab+")) == NULL) {
            MessageBox::Show("Error while opening the file.\n");
            return;
        }
        if (fwrite(&testchar, sizeof(string), 1, fp) != 1)
            MessageBox::Show("Error while writing to file.\n");
        fclose(fp);
    }
void ImportFromFile2(void)
    {
        string buff;
        buff[0] = '\0';
        FILE  *fp;
        register int i;
 
        if ((fp = fopen("cash", "rb")) == NULL) {
            MessageBox::Show("Error while opening the file.\n");
            return;
        }
        if (fread(&buff, sizeof(string), 1, fp) != 1)
        {
            MessageBox::Show("Error while reading the file.\n");
        }
        //testchar = buff;
        /*String^ sys_str = gcnew String(testchar.c_str());
        MessageBox::Show("test   "+sys_str);*/
        fclose(fp);
    }
На этапе выхода из последней процедуры выскакивает ошибка.
Пишу в Visual Studio 2013 в windows forms
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.05.2014, 23:22
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка "Попытка чтения в запрещенную память" при работе с файлами (C++):

Ошибка: "Попытка чтения или записи в защищенную память" - C++
Вот это выдает: Additional information: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память...

Динамический массив структур - ошибка "попытка чтения или записи в защищенную память" - C++
не работает: class Students { struct list { string marka_mashini; string familiya_vladelca; int god_vipuska; ...

Ошибка : Попытка чтения или записи в защищенную память - C++
выходит ошибка после того как выполняется функция void poisk_cena(). Подскажите пожалуйста где ошибка. Ошибка: Необработанное...

Ошибка при работе со списком: "Сбой при преобразовании в COFF: Файл недопустим или поврежден" - C++
struct stud { int data; stud *prev; // Указатель на предыдущую запись stud *next; // Указатель на следующую запись ...

Ошибка при работе с OpenCV: "нарушение прав доступа при чтении по адресу" - C++
Привет, всем:-) Имеется следующий код: #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include...

Ошибка при работе с графикой. Не распознается библиотека "cstdlib" - C++
Здравствуйте, прошу помочь с запуском программы. Я её компилировал в старом Борланде и там куча ошибок и не распознает библиотеку...

15
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.05.2014, 23:24 #2
Цитата Сообщение от TheStigger Посмотреть сообщение
Пишу в Visual Studio 2013 в windows forms
http://www.cyberforum.ru/cpp-cli-winforms/
0
stima
482 / 334 / 38
Регистрация: 22.03.2011
Сообщений: 1,076
Завершенные тесты: 2
16.05.2014, 23:27 #3
Научитесь работать со строками.
http://www.cplusplus.com/reference/string/string/

Добавлено через 51 секунду
Та причем там cli, там не понимание что такое std::string и с чем его едят.
1. Обращение к 0 элементу дефолтной строки.
2. Взятие указателя на строку, а не на массив символов.

Это то что бросается в глаза.
0
alsav22
16.05.2014, 23:38
  #4

Не по теме:

Цитата Сообщение от stima Посмотреть сообщение
Та причем там cli
При том, что даже и не смотрю, если System::.

0
TheStigger
0 / 0 / 0
Регистрация: 16.05.2014
Сообщений: 14
17.05.2014, 00:02  [ТС] #5
Пытался сделать на основе этой программы:
Отсюда и обращение к нулевым элементам
P.S. Не в ту ветку задал вопрос?
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
/* Простая программа обработки списка рассылки,
в которой используется массив структур. */
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
 
#define MAX 100
 
struct addr {
    char name[30];
    char street[40];
    char city[20];
    char state[3];
    unsigned long int zip;
} addr_list[MAX];
 
void init_list(void), enter(void);
void del(void), list(void);
void load(void), save(void);
int menu_select(void), find_free(void);
 
int main(void)
{
    char choice;
 
    init_list(); /* инициализация массива структур */
    for (;;) {
        choice = menu_select();
        switch (choice) {
        case 1: enter();
            break;
        case 2: del();
            break;
        case 3: list();
            break;
        case 4: save();
            break;
        case 5: load();
            break;
        case 6: exit(0);
        }
    }
 
    return 0;
}
 
/* Инициализация списка. */
void init_list(void)
{
    register int t;
 
    for (t = 0; t<MAX; ++t) addr_list[t].name[0] = '\0';
}
 
/* Получения значения, выбранного  в меню. */
int menu_select(void)
{
    char s[80];
    int c;
 
    printf("1. Input name\n");
    printf("2. Del name\n");
    printf("3. Output list\n");
    printf("4. Save file\n");
    printf("5. Load file\n");
    printf("6. Exit\n");
    do {
        printf("\nInput number of point: ");
        gets(s);
        c = atoi(s);
    } while (c<0 || c>6);
    return c;
}
 
/* Добавление адреса в список. */
void enter(void)
{
    int slot;
    char s[80];
 
    slot = find_free();
 
    if (slot == -1) {
        printf("\nList is full");
        return;
    }
 
    printf("Input name: ");
    gets(addr_list[slot].name);
 
    printf("Input street: ");
    gets(addr_list[slot].street);
 
    printf("Input city: ");
    gets(addr_list[slot].city);
 
    printf("Input state: ");
    gets(addr_list[slot].state);
 
    printf("Input post index: ");
    gets(s);
    addr_list[slot].zip = strtoul(s, '\0', 10);
}
 
/* Поиск свободной структуры. */
int find_free(void)
{
    register int t;
 
    for (t = 0; addr_list[t].name[0] && t<MAX; ++t);
 
    if (t == MAX) return -1; /* свободных структур нет */
    return t;
}
 
/* Удаление адреса. */
void del(void)
{
    register int slot;
    char s[80];
 
    printf("Input # of record: ");
    gets(s);
    slot = atoi(s);
 
    if (slot >= 0 && slot < MAX)
        addr_list[slot].name[0] = '\0';
}
 
/* Вывод списка на экран. */
void list(void)
{
    register int t;
 
    for (t = 0; t<MAX; ++t) {
        if (addr_list[t].name[0]) {
            printf("%s\n", addr_list[t].name);
            printf("%s\n", addr_list[t].street);
            printf("%s\n", addr_list[t].city);
            printf("%s\n", addr_list[t].state);
            printf("%lu\n\n", addr_list[t].zip);
        }
    }
    printf("\n\n");
}
 
/* Сохранение списка. */
void save(void)
{
    FILE  *fp;
    register int i;
 
    if ((fp = fopen("maillist", "ab+")) == NULL) {
        printf("Error while opening the file.\n");
        return;
    }
 
    for (i = 0; i<MAX; i++)
    if (*addr_list[i].name)
    if (fwrite(&addr_list[i],
        sizeof(struct addr), 1, fp) != 1)
        printf("Error while writing to file.\n");
 
    fclose(fp);
}
 
/* Загрузить файл. */
void load(void)
{
    FILE  *fp;
    register int i;
 
    if ((fp = fopen("maillist", "rb")) == NULL) {
        printf("Error while opening the file.\n");
        return;
    }
 
    init_list();
    while (!feof(fp))
    {
        for (i = 0;; i++)
        if (fread(&addr_list[i], sizeof(struct addr), 1, fp) != 1) 
        {
            if (feof(fp)) break;
            printf("Error while reading the file.\n");
        }
    }
 
    fclose(fp);
}
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.05.2014, 00:16 #6
stima, уже написал. Вот здесь строка пустая, и обращение по индексу:
C++
1
2
string buff;
buff[0] = '\0';
Добавлено через 2 минуты
Цитата Сообщение от TheStigger Посмотреть сообщение
C++
1
fread(&buff, sizeof(string), 1, fp)
Так со string не работают. Читать в память под string - это не то, что нужно. string - это не массив char.
0
TheStigger
0 / 0 / 0
Регистрация: 16.05.2014
Сообщений: 14
17.05.2014, 00:30  [ТС] #7
Ну вот мой первоначальный вариант со структурой. Изначально логика такова: при запуске программа проверяет в файле наличие записей на сегодняшний день и выводит их. Если нет записей, то их можно добавить и записать в файл. При открытии файла программа должна искать соответствующую запись по дате. Но вот у меня пока даже просто не считывает структуру без всяких условий.
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
void OutputNote(int& day, int& month, int& year)
    {
        organizer note[N];
        note[0].date = DateToString(day, month, year);//присваиваем первой структуре дату
        ImportFromFile(note);
        String^ sys_str = gcnew String(note[0].text.c_str());
        richTextBox2->Text = sys_str;
    }
 
    void ImportFromFile(organizer note[N])
    {
        organizer buff[N];
        FILE  *fp;
        register int i;
 
        if ((fp = fopen("cash", "rb")) == NULL) {
            MessageBox::Show("Error while opening the file.\n");
            return;
        }
        /*for (int j = 0; j < N; j++)
        {
            buff[j].text[0] = '\0';
        }*/
        for (i = 0;; i++)
        if (fread(&buff[i], sizeof(struct organizer), 1, fp) == 1)
        {
            break;
        }
        else
        {
            if (feof(fp)) break;
            MessageBox::Show("Error while reading the file.\n");
        }
        note[0].text = buff[i].text;
        fclose(fp);
    }
 
void ExportToFile(organizer note[N])
    {
        FILE  *fp;
        register int i;
        if ((fp = fopen("cash", "ab+")) == NULL) {
            MessageBox::Show("Error while opening the file.\n");
            return;
        }
 
        for (i = 0; i<N; i++)
        if (fwrite(&note[0],sizeof(struct organizer), 1, fp) != 1)
            MessageBox::Show("Error while writing to file.\n");
        fclose(fp);
    }
 
...
//Экспорт вызывается нажатием на кнопку 
    private: System::Void button3_Click(System::Object^  sender, System::EventArgs^  e) {
                 String^ textbox_text = richTextBox2->Text;
                 organizer note[N];
                 MarshalString(textbox_text, note[0].text);
                 int day=0, month=0, year=0;
                 CurrentDate(day, month, year);
                 note[0].date = DateToString(day, month, year);
                 ExportToFile(note);
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.05.2014, 01:07 #8
Цитата Сообщение от TheStigger Посмотреть сообщение
Но вот у меня пока даже просто не считывает структуру без всяких условий.
Откуда видите, что не считывает?
0
TheStigger
0 / 0 / 0
Регистрация: 16.05.2014
Сообщений: 14
17.05.2014, 01:09  [ТС] #9
Неправильно сформулировал. У меня считывается и даже выводится, но сразу после окончания процедуры выскакивает ошибка. Аналогичная ошибка была при использовании ofstream и ifstream

Закомментировал лишний цикл в экспорте. Теперь вообще перестало выводить в файл (обнаружил, что до этого выводило N раз в файл).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    void ExportToFile(organizer note[N])
    {
        FILE  *fp;
        register int i;
        if ((fp = fopen("cash", "ab+")) == NULL) {
            MessageBox::Show("Error while opening the file.\n");
            return;
        }
 
        //for (i = 0; i<N; i++)
        if (fwrite(&note[0],sizeof(struct organizer), 1, fp) != 1)
            MessageBox::Show("Error while writing to file.\n");
        fclose(fp);
    }
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.05.2014, 01:14 #10
Цитата Сообщение от TheStigger Посмотреть сообщение
но сразу после окончания процедуры выскакивает ошибка.
Какая?
0
TheStigger
0 / 0 / 0
Регистрация: 16.05.2014
Сообщений: 14
17.05.2014, 01:18  [ТС] #11
Я же писал в самом начале писал.
"Необработанное исключение типа "System.AccessViolationException" в CourseWork1.exe
Дополнительные сведения: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена."
Скриншот
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.05.2014, 01:38 #12
Цитата Сообщение от TheStigger Посмотреть сообщение
Я же писал в самом начале писал.
В начале один код был, теперь, я так понимаю, другой. Какой код пробуете? В какой строке ошибка возникает? Отладчиком проходили?
0
TheStigger
0 / 0 / 0
Регистрация: 16.05.2014
Сообщений: 14
17.05.2014, 01:41  [ТС] #13
Цитата Сообщение от alsav22 Посмотреть сообщение
В начале один код был, теперь, я так понимаю, другой. Какой код пробуете? В какой строке ошибка возникает? Отладчиком проходили?
У меня считывается и даже выводится, но сразу после окончания процедуры импорта выскакивает ошибка. Отладчиком пробовал. Код и тот и тот аналогичную ошибку выдает
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.05.2014, 01:50 #14
Цитата Сообщение от TheStigger Посмотреть сообщение
Код и тот и тот аналогичную ошибку выдает
Коды разные, и одна и таже ошибка может быть по разным поводам. В этой функции ошибка возникает? В какой строке?
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
void ImportFromFile(organizer note[N])
    {
        organizer buff[N];
        FILE  *fp;
        register int i;
 
        if ((fp = fopen("cash", "rb")) == NULL) {
            MessageBox::Show("Error while opening the file.\n");
            return;
        }
        /*for (int j = 0; j < N; j++)
        {
            buff[j].text[0] = '\0';
        }*/
        for (i = 0;; i++)
        if (fread(&buff[i], sizeof(struct organizer), 1, fp) == 1)
        {
            break;
        }
        else
        {
            if (feof(fp)) break;
            MessageBox::Show("Error while reading the file.\n");
        }
        note[0].text = buff[i].text;
        fclose(fp);
    }
0
DU
1483 / 1129 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
17.05.2014, 01:57 #15
note[0].text = buff[i].text;
этот код выполняется вне тела цикла. в этом месте i может превышать размер массива buff.
так же это может случится и в строке 16. что отладчик говорит? какие там у вас индексы?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.05.2014, 01:57
Привет! Вот еще темы с ответами:

При работе с free в деструкторе ошибка "Invalid address specified to RtlValidateHeap" - C++
Доброго времени суток, господа эксперты и дамы эксперты. Объясните пожалуйста почему программа вылетает с ошибкой &quot;program.exe has...

Ошибка "Access violation writing location" при работе с массивом. - C++
Задание номер 2 #include &lt;stdio.h&gt; #include &lt;cstdlib&gt; #include &lt;math.h&gt; #include &lt;cmath&gt; #include &lt;iostream&gt; #include...

Ошибка "error C4430: missing type specifier" при работе с fstream - C++
Добрый день. Работаю над сохранением и загрузкой файлов. Для этого использую библиотеку &lt;fstream&gt;, создаю обьект класса fstream. А...

Ошибка "в вызове функции отсутствует список аргументов" при работе с классами - C++
Учусь работать с классами С++ но часто встречаюсь с ошибкой: c:\program files (x86)\microsoft visual studio...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
17.05.2014, 01:57
Ответ Создать тему
Опции темы

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