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

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

Восстановить пароль Регистрация
 
power12
6 / 6 / 1
Регистрация: 14.04.2010
Сообщений: 100
16.08.2013, 17:23     Необработанное исключение. Нарушение прав доступа при чтении #1
Ребят помогите.
В общем есть программа, открывает один файл, ищет в нем последовательности, заменяет на другие. В консоли все прекрасно работает и сохраняет. Сделал интерфейсную программу, с двумя кнопкам "Открыть файл" и "Сохранить файл".
В буфер все записывается.

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

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

Это может быть вызвано повреждением кучи и указывает на ошибку в 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;
    }
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.08.2013, 17:23     Необработанное исключение. Нарушение прав доступа при чтении
Посмотрите здесь:

C++ Необработанное исключение в "0x00412b4a" в "kursovik.exe": 0xC0000005: Нарушение прав доступа при чтении "0x00000004".
C++ Необработанное исключение в "0x76f015de" в "контрольная 1 задача 2.exe": 0xC0000005: Нарушение прав доступа при чтении "0x334e2c64"
Необработанное исключение в "0x00414558" в "467.exe": 0xC0000005: Нарушение прав доступа при чтении "0xabababbb" C++
Необработанное исключение в "0x775e15de" в "laba3.exe": 0xC0000005: Нарушение прав доступа при чтении "0xfdfdfdf9". C++
Необработанное исключение в "0x778e15de" в "dir-3.exe": 0xC0000005: Нарушение прав доступа при чтении "0x00000000" C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
16.08.2013, 17:29     Необработанное исключение. Нарушение прав доступа при чтении #2
Где падает?
stragger
38 / 38 / 2
Регистрация: 05.12.2011
Сообщений: 343
16.08.2013, 17:30     Необработанное исключение. Нарушение прав доступа при чтении #3
Покажи весь код, по кускам не ясно.
Скорее всего для buf всё-таки не была выделена память или уже была освобождена где-то.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.08.2013, 17:32     Необработанное исключение. Нарушение прав доступа при чтении #4
Цитата Сообщение от power12 Посмотреть сообщение
int size;
char *buf = new char[size];
И чему size равен?
power12
6 / 6 / 1
Регистрация: 14.04.2010
Сообщений: 100
17.08.2013, 14:05  [ТС]     Необработанное исключение. Нарушение прав доступа при чтении #5
Это может быть вызвано повреждением кучи и указывает на ошибку в 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];
то все работает.
как сделать с динамическим массивом?
Убежденный
Системный программист
 Аватар для Убежденный
14216 / 6231 / 988
Регистрация: 02.05.2013
Сообщений: 10,390
Завершенные тесты: 1
17.08.2013, 14:08     Необработанное исключение. Нарушение прав доступа при чтении #6
C++
1
char *buf = new char[300000];
Не забудьте потом вызвать delete [] buf.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.08.2013, 14:15     Необработанное исключение. Нарушение прав доступа при чтении #7
Цитата Сообщение от power12 Посмотреть сообщение
сделал ноль, но все равно вылетает.
Массив нулевого размера? И хотите чтобы работало?

Цитата Сообщение от Убежденный Посмотреть сообщение
C++
1
char *buf = new char[300000];
Не забудьте потом вызвать delete [] buf.
Лучше уж тогда так:
C++
1
2
int size = 300000;
char *buf = new char[size];
Убежденный
Системный программист
 Аватар для Убежденный
14216 / 6231 / 988
Регистрация: 02.05.2013
Сообщений: 10,390
Завершенные тесты: 1
17.08.2013, 14:16     Необработанное исключение. Нарушение прав доступа при чтении #8
Ну тогда уж лучше так:
C++
1
2
size_t const BuffSize = 300000;
boost::scoped_array<char> Buff(new char[BuffSize]);
alsav22
17.08.2013, 14:26
  #9

Не по теме:

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

power12
6 / 6 / 1
Регистрация: 14.04.2010
Сообщений: 100
17.08.2013, 14:29  [ТС]     Необработанное исключение. Нарушение прав доступа при чтении #10
Убежденный, 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;
я не знаю заранее размер массива, определяю размер, и пихаю этот размер в массив.

файл размером пару кб прекрасно работает. больше, уже не работает.
Убежденный
Системный программист
 Аватар для Убежденный
14216 / 6231 / 988
Регистрация: 02.05.2013
Сообщений: 10,390
Завершенные тесты: 1
17.08.2013, 14:32     Необработанное исключение. Нарушение прав доступа при чтении #11
Цитата Сообщение от power12 Посмотреть сообщение
C++
1
2
unsigned long size ;
char *buf = new char[size];
Потому что size = ?
power12
6 / 6 / 1
Регистрация: 14.04.2010
Сообщений: 100
17.08.2013, 14:40  [ТС]     Необработанное исключение. Нарушение прав доступа при чтении #12
Цитата Сообщение от Убежденный Посмотреть сообщение
Потому что size = ?
да, я тебя понял про что ты. То есть, сначала надо определить размер файла, а потом запихать это размер, как размер массива?

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

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

как тогда сделать, что бы размер массива соответствовал размеру файлу?)
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.08.2013, 14:42     Необработанное исключение. Нарушение прав доступа при чтении #13
Цитата Сообщение от power12 Посмотреть сообщение
как тогда сделать, что бы размер массива соответствовал размеру файлу?)
Вот так:
Цитата Сообщение от power12 Посмотреть сообщение
То есть, сначала надо определить размер файла, а потом запихать это размер, как размер массива
Убежденный
Системный программист
 Аватар для Убежденный
14216 / 6231 / 988
Регистрация: 02.05.2013
Сообщений: 10,390
Завершенные тесты: 1
17.08.2013, 14:45     Необработанное исключение. Нарушение прав доступа при чтении #14
Цитата Сообщение от power12 Посмотреть сообщение
сначала надо определить размер файла, а потом запихать это размер, как размер массива?
Именно так.
Ну и на будущее держать в уме, что файл может и не уместиться в массиве целиком и
читать его и работать с ним нужно будет по частям.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.08.2013, 14:59     Необработанное исключение. Нарушение прав доступа при чтении
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
power12
6 / 6 / 1
Регистрация: 14.04.2010
Сообщений: 100
17.08.2013, 14:59  [ТС]     Необработанное исключение. Нарушение прав доступа при чтении #15
Цитата Сообщение от Убежденный Посмотреть сообщение
Именно так.
Ну и на будущее держать в уме, что файл может и не уместиться в массиве целиком и
читать его и работать с ним нужно будет по частям.
Спасибо. это мне как раз и интересно узнать и научиться. читать по n-байт, пихать в массив, обрабатывать, удалять, потом след n-байт и так далее)

самое сложно для меня - реализовать. а идей полно. читать же можно через fseek, запомнил позицию и так по кругу)
Yandex
Объявления
17.08.2013, 14:59     Необработанное исключение. Нарушение прав доступа при чтении
Ответ Создать тему
Опции темы

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