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

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

Войти
Регистрация
Восстановить пароль
 
power12
6 / 6 / 1
Регистрация: 14.04.2010
Сообщений: 100
#1

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

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

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

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

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

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

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

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

14
Croessmah
Ушел
13777 / 8027 / 927
Регистрация: 27.09.2012
Сообщений: 19,783
Записей в блоге: 3
Завершенные тесты: 1
16.08.2013, 17:29 #2
Где падает?
0
stragger
39 / 39 / 2
Регистрация: 05.12.2011
Сообщений: 343
16.08.2013, 17:30 #3
Покажи весь код, по кускам не ясно.
Скорее всего для buf всё-таки не была выделена память или уже была освобождена где-то.
0
alsav22
5437 / 4832 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.08.2013, 17:32 #4
Цитата Сообщение от power12 Посмотреть сообщение
int size;
char *buf = new char[size];
И чему size равен?
0
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];
то все работает.
как сделать с динамическим массивом?
0
Убежденный
Ушел с форума
Эксперт С++
15937 / 7247 / 1140
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
17.08.2013, 14:08 #6
C++
1
char *buf = new char[300000];
Не забудьте потом вызвать delete [] buf.
1
alsav22
5437 / 4832 / 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];
1
Убежденный
Ушел с форума
Эксперт С++
15937 / 7247 / 1140
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
17.08.2013, 14:16 #8
Ну тогда уж лучше так:
C++
1
2
size_t const BuffSize = 300000;
boost::scoped_array<char> Buff(new char[BuffSize]);
0
alsav22
17.08.2013, 14:26
  #9

Не по теме:

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

0
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;
я не знаю заранее размер массива, определяю размер, и пихаю этот размер в массив.

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

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

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

как тогда сделать, что бы размер массива соответствовал размеру файлу?)
0
alsav22
5437 / 4832 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.08.2013, 14:42 #13
Цитата Сообщение от power12 Посмотреть сообщение
как тогда сделать, что бы размер массива соответствовал размеру файлу?)
Вот так:
Цитата Сообщение от power12 Посмотреть сообщение
То есть, сначала надо определить размер файла, а потом запихать это размер, как размер массива
0
Убежденный
Ушел с форума
Эксперт С++
15937 / 7247 / 1140
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
17.08.2013, 14:45 #14
Цитата Сообщение от power12 Посмотреть сообщение
сначала надо определить размер файла, а потом запихать это размер, как размер массива?
Именно так.
Ну и на будущее держать в уме, что файл может и не уместиться в массиве целиком и
читать его и работать с ним нужно будет по частям.
0
power12
6 / 6 / 1
Регистрация: 14.04.2010
Сообщений: 100
17.08.2013, 14:59  [ТС] #15
Цитата Сообщение от Убежденный Посмотреть сообщение
Именно так.
Ну и на будущее держать в уме, что файл может и не уместиться в массиве целиком и
читать его и работать с ним нужно будет по частям.
Спасибо. это мне как раз и интересно узнать и научиться. читать по n-байт, пихать в массив, обрабатывать, удалять, потом след n-байт и так далее)

самое сложно для меня - реализовать. а идей полно. читать же можно через fseek, запомнил позицию и так по кругу)
0
17.08.2013, 14:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.08.2013, 14:59
Привет! Вот еще темы с ответами:

Необработанное исключение в "0x00414558" в "467.exe": 0xC0000005: Нарушение прав доступа при чтении "0xabababbb" - C++
При выполнении этого кода #include &lt;iostream&gt; #include&lt;conio.h&gt; using namespace std; int main () { int x; unsigned int...

Необработанное исключение в "0x778e15de" в "dir-3.exe": 0xC0000005: Нарушение прав доступа при чтении "0x00000000" - C++
#include &lt;windows.h&gt; #include &lt;d3d9.h&gt; LRESULT __stdcall WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); struct...

Необработанное исключение в "0x00412b4a" в "kursovik.exe": 0xC0000005: Нарушение прав доступа при чтении "0x00000004". - C++
Программа компилируется нормально но потом на строчке MoveToEx(hdc,Mas.a]-&gt;x*20,Mas.a]-&gt;y*20,0); выдаёт ошибку Помогите пожалуйста...

Необработанное исключение в "0x775e15de" в "laba3.exe": 0xC0000005: Нарушение прав доступа при чтении "0xfdfdfdf9". - C++
вылезает ошибка Необработанное исключение в &quot;0x775e15de&quot; в &quot;laba3.exe&quot;: 0xC0000005: Нарушение прав доступа при чтении &quot;0xfdfdfdf9&quot;. ...


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

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

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