Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/34: Рейтинг темы: голосов - 34, средняя оценка - 4.59
6 / 6 / 7
Регистрация: 14.04.2010
Сообщений: 101

Необработанное исключение. Нарушение прав доступа при чтении

16.08.2013, 17:23. Показов 7283. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ребят помогите.
В общем есть программа, открывает один файл, ищет в нем последовательности, заменяет на другие. В консоли все прекрасно работает и сохраняет. Сделал интерфейсную программу, с двумя кнопкам "Открыть файл" и "Сохранить файл".
В буфер все записывается.

Исрользуется динамический массив.
Файловые потоки в конце закрываю.
Массив удаляю.

Действие такое, нажал "Открыть файл" обработал его, нажал сохранить, выскакивает ошибка:

Это может быть вызвано повреждением кучи и указывает на ошибку в File_Repl.exe или в одной из загруженных им DLL.
C++
1
2
    int size;
    char *buf = new char[size];
открываю
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
file_open = fopen(path,"rb");
        
        struct stat file_size;
        stat(path, &file_size);
        size = file_size.st_size;
 
 
        fread(buf, sizeof(c), size, file_open); // дин массив
 
        fTell = ftell(file_open);
 
        int z = 0;  // для перебора массива и замены данных
        int i = 0;  // для перебора массива и замены данных
 
        for(i = 0; i < fTell; i++)
            {
                if(buf[i] == first_symb)
                {
                    for(z = 0; z < 8; z++)
                    {
                        if(z < 7)
                        {
                            if((buf[i + z * 2] == first_symb) && (buf[i + z * 2 + 1] == replace_symb))
                            {
                                continue;
                            }
                            else break;
                        }
                        if((buf[i + z * 2 + 1]) == last_symb)
                        {
                            buf[i + z * 2 + 1] = replace_symb;
                            i += (z * 2 + 1);
                        }
                    }
                }
            }
        fclose(file_open);
сохраняю

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    if(SaveFileDlg.DoModal()==IDOK)
    {
        path=SaveFileDlg.GetPathName();
        path_sf = path;
        
        file_save = fopen(path,"wb");
        
        for(int i = 0; i < fTell; i++)
        {
            fprintf(file_save,"%c", (unsigned char)buf[i]); 
        }
        
        fclose(file_save);
        delete [] buf;
    }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.08.2013, 17:23
Ответы с готовыми решениями:

Необработанное исключение по адресу 0x008B94C5. 0xC0000005: нарушение прав доступа при чтении по
Здравствуйте! Функция должна искать локальные минимумы массива. То есть это элементы,которые меньше своих соседей. Дело в том,что функция...

Необработанное исключение по адресу 0x00E730CD в ConsoleApplication18.exe: 0xC0000005: нарушение прав доступа при чтении
Задана целочисленная динамическая матрица M. Элементы этой матрицы, без остатка делящиеся на 6, переписать в динамический массив L и найти...

Необработанное исключение: "Нарушение прав доступа при чтении"
При выполнении тестов {input...output} появляется необработанное исключение по адресу 0x009577E1 в 1590.exe: 0xC0000005: нарушение прав...

14
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
16.08.2013, 17:29
Где падает?
0
40 / 40 / 5
Регистрация: 05.12.2011
Сообщений: 343
16.08.2013, 17:30
Покажи весь код, по кускам не ясно.
Скорее всего для buf всё-таки не была выделена память или уже была освобождена где-то.
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
16.08.2013, 17:32
Цитата Сообщение от power12 Посмотреть сообщение
int size;
char *buf = new char[size];
И чему size равен?
0
6 / 6 / 7
Регистрация: 14.04.2010
Сообщений: 101
17.08.2013, 14:05  [ТС]
Это может быть вызвано повреждением кучи и указывает на ошибку в File_Replacement.exe или в одной из загруженных им DLL.
Возможной причиной так же может быть нажатие пользователем клавиши F12, когда фокус принадлежит File_Replacement.exe
Выведенное на экран окно содержит дополнительные данные для диагностики ошибки


Цитата Сообщение от alsav22 Посмотреть сообщение
И чему size равен?
сделал ноль, но все равно вылетает.

Croessmah, stragger,*вот код.


Кликните здесь для просмотра всего текста
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
char first_symb = 0xBA;
    char last_symb = 0xAB;
    char replace_symb = 0xAA;   
 
    int size = 0;
    char *buf = new char[size];
    char c;
    long fTell;
 
void CFile_ReplacementDlg::OpenFile()
{
    CString path;
    FILE *file_open;
    CFileDialog OpenFileDlg(true);
 
    TCHAR title[] = "Открыть файл";
    OpenFileDlg.m_pOFN->lpstrTitle = title;
 
    if(OpenFileDlg.DoModal()==IDOK)
    {
        path = OpenFileDlg.GetPathName();
        path_of = path;
 
        file_open = fopen(path,"rb");
        
        struct stat file_size;
        stat(path, &file_size);
        size = file_size.st_size;
 
 
        fread(buf, sizeof(c), size, file_open); // дин массив
 
        fTell = ftell(file_open);
 
        int z = 0;  // для перебора массива и замены данных
        int i = 0;  // для перебора массива и замены данных
 
        for(i = 0; i < fTell; i++)
            {
                if(buf[i] == first_symb)
                {
                    for(z = 0; z < 8; z++)
                    {
                        if(z < 7)
                        {
                            if((buf[i + z * 2] == first_symb) && (buf[i + z * 2 + 1] == replace_symb))
                            {
                                continue;
                            }
                            else break;
                        }
                        if((buf[i + z * 2 + 1]) == last_symb)
                        {
                            buf[i + z * 2 + 1] = replace_symb;
                            i += (z * 2 + 1);
                        }
                    }
                }
            }
        fclose(file_open);
        }
    UpdateData(false);
}
 
 
void CFile_ReplacementDlg::SaveFile()
{
    CString path;
    FILE *file_save;
    CFileDialog SaveFileDlg(false);
 
    TCHAR title[] = "Сохранить файл как";
    SaveFileDlg.m_pOFN->lpstrTitle = title;
 
    TCHAR name[_MAX_PATH] = "Solve.emp";
    SaveFileDlg.m_pOFN->lpstrFile = name;
 
    if(SaveFileDlg.DoModal()==IDOK)
    {
        path=SaveFileDlg.GetPathName();
        path_sf = path;
        
        file_save = fopen(path,"wb");
        
        for(int i = 0; i < fTell; i++)
        {
            fprintf(file_save,"%c", (unsigned char)buf[i]); 
        }
        
        fclose(file_save);
        delete [] buf;
    }
    UpdateData(false);
    
}


Добавлено через 39 минут
В общем, дело в динамическом массиве, если сделать
C++
1
char buf[300000];
то все работает.
как сделать с динамическим массивом?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
17.08.2013, 14:08
C++
1
char *buf = new char[300000];
Не забудьте потом вызвать delete [] buf.
1
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
17.08.2013, 14:15
Цитата Сообщение от power12 Посмотреть сообщение
сделал ноль, но все равно вылетает.
Массив нулевого размера? И хотите чтобы работало?

Цитата Сообщение от Убежденный Посмотреть сообщение
C++
1
char *buf = new char[300000];
Не забудьте потом вызвать delete [] buf.
Лучше уж тогда так:
C++
1
2
int size = 300000;
char *buf = new char[size];
1
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
17.08.2013, 14:16
Ну тогда уж лучше так:
C++
1
2
size_t const BuffSize = 300000;
boost::scoped_array<char> Buff(new char[BuffSize]);
0
17.08.2013, 14:26

Не по теме:

Цитата Сообщение от Убежденный Посмотреть сообщение
Ну тогда уж лучше так:
Это уже слишком (кроме const) для начинающего. Лучшее - враг хорошего...:stop:

0
6 / 6 / 7
Регистрация: 14.04.2010
Сообщений: 101
17.08.2013, 14:29  [ТС]
Убежденный, alsav22,

хорошо, так работает, а но почему не работает как у меня?

C++
1
2
3
4
5
6
    unsigned long size ;
    char *buf = new char[size];
 
        struct stat file_size;
        stat(path, &file_size);
        size = file_size.st_size;
я не знаю заранее размер массива, определяю размер, и пихаю этот размер в массив.

файл размером пару кб прекрасно работает. больше, уже не работает.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
17.08.2013, 14:32
Цитата Сообщение от power12 Посмотреть сообщение
C++
1
2
unsigned long size ;
char *buf = new char[size];
Потому что size = ?
0
6 / 6 / 7
Регистрация: 14.04.2010
Сообщений: 101
17.08.2013, 14:40  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
Потому что size = ?
да, я тебя понял про что ты. То есть, сначала надо определить размер файла, а потом запихать это размер, как размер массива?

а у меня сначала создается массив, а потом определяется размер.

я запутался уже)

как тогда сделать, что бы размер массива соответствовал размеру файлу?)
0
5499 / 4894 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
17.08.2013, 14:42
Цитата Сообщение от power12 Посмотреть сообщение
как тогда сделать, что бы размер массива соответствовал размеру файлу?)
Вот так:
Цитата Сообщение от power12 Посмотреть сообщение
То есть, сначала надо определить размер файла, а потом запихать это размер, как размер массива
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
17.08.2013, 14:45
Цитата Сообщение от power12 Посмотреть сообщение
сначала надо определить размер файла, а потом запихать это размер, как размер массива?
Именно так.
Ну и на будущее держать в уме, что файл может и не уместиться в массиве целиком и
читать его и работать с ним нужно будет по частям.
0
6 / 6 / 7
Регистрация: 14.04.2010
Сообщений: 101
17.08.2013, 14:59  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
Именно так.
Ну и на будущее держать в уме, что файл может и не уместиться в массиве целиком и
читать его и работать с ним нужно будет по частям.
Спасибо. это мне как раз и интересно узнать и научиться. читать по n-байт, пихать в массив, обрабатывать, удалять, потом след n-байт и так далее)

самое сложно для меня - реализовать. а идей полно. читать же можно через fseek, запомнил позицию и так по кругу)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.08.2013, 14:59
Помогаю со студенческими работами здесь

Необработанное исключение по адресу 0x00105FD7 в Динамические структуры: 0xC0000005: нарушение прав доступа при чтении по адресу 0xCDCDCE09
Необработанное исключение по адресу 0x00105FD7 в Динамические структуры.exe: 0xC0000005: нарушение прав доступа при чтении по адресу...

Необработанное исключение по адресу 0x001B3371 в XXX.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xFDF
Делал консольную змейку и столкнулся вот с такой проблемой. void stena(char **arr) { int y = 0; int x = 0; ...

Необработанное исключение по адресу 0x00ED4891 в strings.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xCCCCCCCC
Программа толком не написан, проверял ранд и возникли проблемы. Ф-ция ранд генерирует одно и тоже число, но если убрать srand(time(0));,...

Необработанное исключение в "0x0138169d" в "kursovaya.exe": 0xC0000005: Нарушение прав доступа при чтении "0x6
Программа выдает ошибку, может кто видит где? и как исправить Код: #include &lt;iostream&gt; #include &lt;ctime&gt; #include...

Необработанное исключение: нарушение прав доступа при записи
Есть функция ввода текста. Текст с неизвестным количеством и длиной строк. При отладке прерывается и выдает: &quot;Необработанное...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru