Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
1 / 1 / 0
Регистрация: 02.07.2020
Сообщений: 43
1

Нарушение доступа для записи

21.09.2020, 20:24. Показов 2359. Ответов 28

Author24 — интернет-сервис помощи студентам
Здравствуйте, при работе с файловым вводом/выводом столкнулся с проблемой записи в структуру данных с файла.

Выкладываю большой кусок кода, ведь не могу знать в чем именно проблема. (Указано место где Visyal Studio останавливает работу программы)

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
struct zavod
{
    char*   farm;
    int     type;
    double  weight;
    int     quant;
    double  cost;
};
 
int count() // количество записанных элементов структуры 
{
    int i = 0;
    ifstream file("1.txt");
    if (!file)
    {
        ;
    }
    else
    {
        while (!file.eof())
        {
            if (file.get() == '\n')
            {
                i++;
            }
        }
    }
    return(i);
}
 
void file_out(zavod* arr, int i) // перезапись файла с включениям всех элементов структуры из памяти
{
    ofstream file("1.txt");
    for (int k = 0; k < i+1; k++)
    {
        file << arr[k].farm << " ";
        file << arr[k].type << " ";
        file << arr[k].weight << " ";
        file << arr[k].quant << " ";
        file << arr[k].cost << '\n';
    }
    file.close();
}
 
 
void file_in(zavod* arr, int i) // вывод данных из файла, который отказывается работать
{
    ifstream file("1.txt");
    int k = 0;
 
    if (!file)
    {
        ;
    }
    else
    {
        while(!file.eof())
        {
            while (k < i)
            {
                file >> arr[k].farm; // <---------------- Здесь обрывается прога
                file >> arr[k].type;
                file >> arr[k].weight;
                file >> arr[k].quant;
                file >> arr[k].cost;
                k++;
            }
        }
    }
    file.close();
}
Далее идет функция с помощью которой я заполняю структуру.

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
int case_1(zavod* arr, int i)
{
    system("cls");
    char* z = new char[18];
    int a = 0;
    double a1 = 0;
    int p = 0;
 
    if (i > 49)
    {
        cout << "\nБаза данных уже заполнена" << endl;
        cout << "\nДля продолжения введите любой символ" << endl;
        cin >> z;
        return (i);
    }
 
    cout << "\nВведите следующие данные (Латиница. Ограничение 17 символов)" << endl;
    cout << "Название изделия: ";
 
    while (1) // *char
    {
        if (fgets(z, 18, stdin) != 0)
        {
            if (z[strlen(z) - 1] != '\n')
            {
                while (cin.get() != '\n')
                    ; // очистка неиспользованных символов
            }
            else
            {
                z[strlen(z) - 1] = '\0';
            }
 
            char* ch = new char[18];
            strcpy(ch, z);
            for (int j = 0; j < strlen(ch); j++)
            {
                if (isdigit(ch[j]) || isalpha(ch[j]) || ch[j] == 32)
                {
                    ;
                }
                else
                {
                    p++;
                    break;
                }
            }
 
            if (p == 0)
            {
                strcpy(arr[i].farm, z);
                break;
            }
            else
            {
                cout << "\nНе корректный ввод. Повторите попытку: ";
                p = 0;
            }
        }
    }
    cout << "Тип изделия (1 - булочка, 2 - пирожок, 3 - пирожное, 4 - другое): ";
    cin >> z;
 
    while (1) // int
    {
        if (isdigit(*z) && *z < 53 && *z != 48 && (z[1] == '\n' || z[1] == '\0'))
        {
            a = atoi(z);
            arr[i].type = a;
            break;
        }
        else
        {
            cout << "\nНе корректный ввод. Повторите попытку: ";
            cin >> z;
        }
    }
    cout << "Вес изделия: ";
    cin >> z;
 
    while (1) // double
    {
        if (isdigit(*z))
        {
            a1 = atof(z);
            if (a1 == 0)
            {
                goto GIb;
            }
            else
            {
                arr[i].weight = a1;
                cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // очистка буфера
                break;
            }
        }
        else
            GIb: {
            cout << "\nНе корректный ввод. Повторите попытку: ";
            cin >> z;
        }
    }
    cout << "Количество изделия: ";
    cin >> z;
 
    while (1) // int
    {
        if (isdigit(*z))
        {
            a = atoi(z);
            if (a != -2147483648)
            {
                arr[i].quant = a;
                if (a == 0)
                {
                    goto GIb1;
                }
                cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // очистка буфера
                break;
            }
            else
            {
                cout << "\nНе корректный ввод. Повторите попытку: ";
                cin >> z;
            }
        }
        else
            GIb1: {
            cout << "\nНе корректный ввод. Повторите попытку: ";
            cin >> z;
        }
    }
    cout << "Цена изделия: ";
    cin >> z;
 
    while (1) // double
    {
        if (isdigit(*z))
        {
            a1 = atof(z);
            arr[i].cost = a1;
            cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // очистка буфера
            break;
        }
 
        else
        {
            cout << "\nНе корректный ввод. Повторите попытку: ";
            cin >> z;
        }
    }
    file_out(arr, i); // вызов функции записи в файл
    i++;
    return (i);
}
И main в придачу

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
int main()
{
    setlocale(LC_ALL, "rus");
    char* z1 = new char[1]; // пока не добавил сюда динамический массив вместо обычного указателя была такая же ошибка к доступу для записи
    int z = 1; 
    int i = 0; // переменная которая обозначает количество элементов структуры во всей программе
    zavod* arr = new zavod[50];
    i = count(); 
    while (z != 6)
    {
        cout << "\n---------------- МЕНЮ ----------------" << endl;
        cout << "\nДобавить новый элемент................1" << endl;
        cout << "Распечатать базу данных...............2" << endl;
        cout << "Поиск изделия по названию.............3" << endl;
        cout << "Фильтр по типу........................4" << endl;
        cout << "Сортировать по уменьшению стоимости...5" << endl;
        cout << "Завершение работы.....................6" << endl;
        cout << "\nКоличество элементов в базе " << i << " (max 50)" << endl;
        cout << "\nДля начала работы программы, введите цифру нужной операции.\n" << endl;
 
        arr[i].farm = new char[18];
        file_in(arr, i); // функция чтения из файла
 
        cin >> z1;
        z = atoi(z1);
 
        while (cin.get() != '\n')
            ;
 
        if (z < 1 || z > 6)
        {
            system("cls");
            cout << "!!!!! Не корректный ввод !!!!!" << endl;
            z = 0;
        }
        switch (z)
        {
            case 1:
            {
                i = case_1(arr, i);
                system("cls");
                cout << "\n!!!!! Элемент успешно добавлен !!!!!" << endl;
                break;
            };
            case 2:
            {
                case_2(arr, i);
                system("cls");
                break;
            };
            case 3:
            {
                case_3(arr, i);
                system("cls");
                break;
            };
            case 4:
            {
                case_4(arr, i);
                system("cls");
                break;
            };
            case 5:
            {
                case_5(arr, i);
                system("cls");
                break;
            };
        }
    }
}
Очень прошу помощи, хочу наконец понять корень проблемы и научится исправлять это не методом научного тыка. Спасибо
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.09.2020, 20:24
Ответы с готовыми решениями:

Вызвано исключение: нарушение доступа для записи
Не понимаю в чем проблема. Ошибку выводит на строке strcpy_s. Помогите пожалуйста. #include...

Вызвано исключение: нарушение доступа для записи
При записи пункта назначения выводит ошибку: Вызвано исключение: нарушение доступа для записи. Как...

Вызвано исключение: нарушение доступа для записи
Не пойму в чем ошибка.MVS 2015. #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;stdio.h&gt;...

Вызвано исключение: нарушение доступа для записи
Помогите пожалуйста решить эту проблему. Я просто не понимаю что эта ошибка означает. #include...

28
1 / 1 / 0
Регистрация: 02.07.2020
Сообщений: 43
21.09.2020, 21:50  [ТС] 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Удали вообще все функции, сделай сначала file_in, потом file_out, убедись что они работают и добавляй потом по-одной
Сделал чтение. При записи опять ошибка доступа к указателю.
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
21.09.2020, 21:52 22
Цитата Сообщение от Aderom Посмотреть сообщение
Сделал чтение. При записи опять ошибка доступа к указателю.
Покажи, как сделал
0
1 / 1 / 0
Регистрация: 02.07.2020
Сообщений: 43
21.09.2020, 21:54  [ТС] 23
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Покажи, как сделал
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
int file_in(zavod* arr, int i)
{
    ifstream file("1.txt");
    int k = 0;
 
    if (!file)
    {
        ;
    }
    else
    {
        while (!file.eof())
        {
            if (k < i)
            {
                arr[k].farm = new char[18];
                file >> arr[k].farm;
                file >> arr[k].type;
                file >> arr[k].weight;
                file >> arr[k].quant;
                file >> arr[k].cost;
                cout << "g" << endl;
                k++;
            }
        }
    }
    file.close();
    return(k-1); // при моей записи остается пустая строка в конце документа, приходится делать -1 (записываю через рабочую в этом плане версию проги)
}
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
21.09.2020, 22:03 24
Лучший ответ Сообщение было отмечено Aderom как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int file_in(zavod* arr, int sz)
{
    ifstream file("1.txt");
    int i = 0;
    for (;i < sz; ++i)
    {
        char farm[18];
        file >> farm;
        if (!file)
            break;
 
        arr[i].farm = new char[18];
        strcpy(arr[i].farm, farm);
 
        file >> arr[i].type;
        file >> arr[i].weight;
        file >> arr[i].quant;
        file >> arr[i].cost;
    }
    return i;
}
Остальное покажи
1
1 / 1 / 0
Регистрация: 02.07.2020
Сообщений: 43
21.09.2020, 22:15  [ТС] 25
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Остальное покажи
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void file_out(zavod* arr, int i)
{
    ofstream file("1.txt");
    for (int k = 0; k < i; k++)
    {
        file << arr[k].farm << " ";
        file << arr[k].type << " ";
        file << arr[k].weight << " ";
        file << arr[k].quant << " ";
        file << arr[k].cost << '\n';
    }
    file.close();
}
Должно работать.

Проблема переехала сюда

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
int case_1(zavod* arr, int i)
{
    system("cls");
    char* z = new char[18];
    int a = 0;
    double a1 = 0;
    int p = 0;
 
    if (i > 49)
    {
        cout << "\nБаза данных уже заполнена" << endl;
        cout << "\nДля продолжения введите любой символ" << endl;
        cin >> z;
        return (i);
    }
    cout << "\nВведите следующие данные (Латиница. Ограничение 17 символов)" << endl;
    cout << "Название изделия: ";
 
    while (1)
    {
        if (fgets(z, 18, stdin) != 0)
        {
            if (z[strlen(z) - 1] != '\n')
            {
                while (cin.get() != '\n')
                    ; // очистка неиспользованных символов
            }
            else
            {
                z[strlen(z) - 1] = '\0';
            }
 
            char* ch = new char[18];
            strcpy(ch, z);
            for (int j = 0; j < strlen(ch); j++)
            {
                if (isdigit(ch[j]) || isalpha(ch[j]) || ch[j] == 32)
                {
                    ;
                }
                else
                {
                    p++;
                    break;
                }
            }
 
            if (p == 0)
            {
                strcpy(arr[i].farm, z); // <------------ вылет по доступу
                break;
            }
            else
            {
                cout << "\nНе корректный ввод. Повторите попытку: ";
                p = 0;
            }
        }
    }
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
21.09.2020, 22:21 26
Цитата Сообщение от Aderom Посмотреть сообщение
strcpy(arr[i].farm, z); // <------------ вылет по доступу
Цитата Сообщение от Aderom Посмотреть сообщение
int case_1(zavod* arr, int i)
Что такое i ?
0
1 / 1 / 0
Регистрация: 02.07.2020
Сообщений: 43
21.09.2020, 22:25  [ТС] 27
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Что такое i ?
Смотри. Допустим у нас 3 элемента массива. Поэтому когда в функцию залетает i == 3
Прога создает место в [3] ячейку массива (на самом деле 4).

Поэтому выделение в этом месте должно быть корректным. Создаем новый элемент в структуре с нужным индексом.
0
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
21.09.2020, 22:31 28
Лучший ответ Сообщение было отмечено Aderom как решение

Решение

Цитата Сообщение от Aderom Посмотреть сообщение
Поэтому выделение в этом месте должно быть корректным. Создаем новый элемент в структуре с нужным индексом.
А где ты здесь выделяешь память под arr[i].farm?
1
1 / 1 / 0
Регистрация: 02.07.2020
Сообщений: 43
21.09.2020, 22:39  [ТС] 29
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
А где ты здесь выделяешь память под arr[i].farm?
Я слепой. Можно поаплодировать. Я забыл что удалял эту строку.

Добавлено через 3 минуты
oleg-m1973,

Спасибо огромное за помощь. Вся программа полностью работоспособна. И я понял почему у меня все не работало. Спасибо еще раз
0
21.09.2020, 22:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.09.2020, 22:39
Помогаю со студенческими работами здесь

Вызвано необработанное исключение: нарушение доступа для записи
Имеется код программы в котором показана реализация очереди. При компиляции программа запускается,...

Вызвано необработанное исключение: нарушение доступа для записи
int main(char B, int x) { int A, temp = 0, n = 0; char tem; temp = x; for (int t = temp; t...

Вызвано исключение: нарушение доступа для записи. . было 0xCCCCCCCC
Знающие люди, объясните как при помощи структур реализовать данную функцию. Как я понял, элементы...

Вызвано исключение: нарушение доступа для записи (хэш-таблицы)
Появляется такая вот надпись, когда пытаюсь запустить: Вызвано исключение: нарушение доступа для...

Исключение: нарушение доступа для записи (найти и исправить ошибку)
Проблема заключается в том, что возникает исключение: нарушение доступа для записи. _Str было...

Вызвано исключение: нарушение доступа для записи (visual studio 2017)
#include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;string&gt; using namespace std; int main() {...


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

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru