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

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

Восстановить пароль Регистрация
 
TheStigger
0 / 0 / 0
Регистрация: 16.05.2014
Сообщений: 14
16.05.2014, 23:22     Ошибка "Попытка чтения в запрещенную память" при работе с файлами #1
Нужно хранить в файле данные со структуры и считывать их.
Перепробовал кучу вариантов (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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.05.2014, 23:22     Ошибка "Попытка чтения в запрещенную память" при работе с файлами
Посмотрите здесь:

C++ Попытка чтения или записи в защищенную память
Ошибка : Попытка чтения или записи в защищенную память C++
Написал класс "Телефонная книга". Но при работе вылетает ошибка. помогите разобраться. C++
C++ Ошибка "неверный тип для индекса массива" при работе с двумерным массивом
Динамический массив структур - ошибка "попытка чтения или записи в защищенную память" C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 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/
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
16.05.2014, 23:27     Ошибка "Попытка чтения в запрещенную память" при работе с файлами #3
Научитесь работать со строками.
http://www.cplusplus.com/reference/string/string/

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

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

Не по теме:

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

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);
}
alsav22
5282 / 4801 / 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.
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);
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.05.2014, 01:07     Ошибка "Попытка чтения в запрещенную память" при работе с файлами #8
Цитата Сообщение от TheStigger Посмотреть сообщение
Но вот у меня пока даже просто не считывает структуру без всяких условий.
Откуда видите, что не считывает?
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);
    }
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.05.2014, 01:14     Ошибка "Попытка чтения в запрещенную память" при работе с файлами #10
Цитата Сообщение от TheStigger Посмотреть сообщение
но сразу после окончания процедуры выскакивает ошибка.
Какая?
TheStigger
0 / 0 / 0
Регистрация: 16.05.2014
Сообщений: 14
17.05.2014, 01:18  [ТС]     Ошибка "Попытка чтения в запрещенную память" при работе с файлами #11
Я же писал в самом начале писал.
"Необработанное исключение типа "System.AccessViolationException" в CourseWork1.exe
Дополнительные сведения: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена."
Скриншот
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.05.2014, 01:38     Ошибка "Попытка чтения в запрещенную память" при работе с файлами #12
Цитата Сообщение от TheStigger Посмотреть сообщение
Я же писал в самом начале писал.
В начале один код был, теперь, я так понимаю, другой. Какой код пробуете? В какой строке ошибка возникает? Отладчиком проходили?
TheStigger
0 / 0 / 0
Регистрация: 16.05.2014
Сообщений: 14
17.05.2014, 01:41  [ТС]     Ошибка "Попытка чтения в запрещенную память" при работе с файлами #13
Цитата Сообщение от alsav22 Посмотреть сообщение
В начале один код был, теперь, я так понимаю, другой. Какой код пробуете? В какой строке ошибка возникает? Отладчиком проходили?
У меня считывается и даже выводится, но сразу после окончания процедуры импорта выскакивает ошибка. Отладчиком пробовал. Код и тот и тот аналогичную ошибку выдает
alsav22
5282 / 4801 / 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);
    }
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
17.05.2014, 01:57     Ошибка "Попытка чтения в запрещенную память" при работе с файлами #15
note[0].text = buff[i].text;
этот код выполняется вне тела цикла. в этом месте i может превышать размер массива buff.
так же это может случится и в строке 16. что отладчик говорит? какие там у вас индексы?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.05.2014, 02:24     Ошибка "Попытка чтения в запрещенную память" при работе с файлами
Еще ссылки по теме:

Ошибка при работе с графикой. Не распознается библиотека "cstdlib" C++
C++ Попытка чтения или записи в защищенную память
Ошибка "Access violation writing location" при работе с массивом. C++

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

Или воспользуйтесь поиском по форуму:
TheStigger
0 / 0 / 0
Регистрация: 16.05.2014
Сообщений: 14
17.05.2014, 02:24  [ТС]     Ошибка "Попытка чтения в запрещенную память" при работе с файлами #16
Цитата Сообщение от alsav22 Посмотреть сообщение
Коды разные, и одна и таже ошибка может быть по разным поводам. В этой функции ошибка возникает? В какой строке?
Ошибка появлялась сразу после выхода из функции.

Сейчас структуру переделал под char и избавился от строк. Но теперь переменные почему-то ничего не возвращают, а в строке 36 ошибка: выражение должно быть допустимым для изменения левосторонним значением

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
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");
            }
            stringstream ss;
            string s;
            ss << note[0].text;
            ss >> s;
            String^ sys_str = gcnew String(s.c_str());
            MessageBox::Show("test input " +sys_str);
            ss << buff[i].text;
            ss >> s;
            sys_str = gcnew String(s.c_str());
            MessageBox::Show("test input " + sys_str);
            //MessageBox::Show("test input "+note[0].text+"    "+buff[i].text);
        //note[0].text = buff[i].text;
        fclose(fp);
    }
Добавлено через 8 минут
Цитата Сообщение от DU Посмотреть сообщение
note[0].text = buff[i].text;
этот код выполняется вне тела цикла. в этом месте i может превышать размер массива buff.
так же это может случится и в строке 16. что отладчик говорит? какие там у вас индексы?
Исправил и при присваивании написал (i-1). Вообще да, там может быть выход за диапазон, но по идее если я записал туда 1 запись, то при считывании индекс i тоже должен быть единице, так что в моих условиях там не должно быть никакого выхода за диапазон
Yandex
Объявления
17.05.2014, 02:24     Ошибка "Попытка чтения в запрещенную память" при работе с файлами
Ответ Создать тему
Опции темы

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