1 / 1 / 0
Регистрация: 02.07.2020
Сообщений: 42
1

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

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

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

Выкладываю большой кусок кода, ведь не могу знать в чем именно проблема. (Указано место где 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
6565 / 4550 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
21.09.2020, 20:42 2
Цитата Сообщение от Aderom Посмотреть сообщение
arr[i].farm = new char[18];
        file_in(arr, i); // функция чтения из файла
Здесь убери arr[i].farm = new char[18]



Цитата Сообщение от Aderom Посмотреть сообщение
file >> arr[k].farm; // <---------------- Здесь обрывается прога
А здесь добавь

C++
1
2
3
4
5
            while (k < i)
            {
arr[k].farm = new char[18];
                file >> arr[k].farm; // <---------------- Здесь обрывается прога
                file >> arr[k].type;
Добавлено через 48 секунд
А ещё лучше, сделай просто
C++
1
2
3
4
5
6
7
8
struct zavod
{
    char  farm[32];
    int     type;
    double  weight;
    int     quant;
    double  cost;
};
0
1 / 1 / 0
Регистрация: 02.07.2020
Сообщений: 42
21.09.2020, 20:45  [ТС] 3
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Здесь убери arr[i].farm = new char[18]
Вылет

Добавлено через 51 секунду
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
А ещё лучше, сделай просто
К сожалению лабник требует 100% соответствия структуры как написано у меня
0
6565 / 4550 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
21.09.2020, 20:50 4
Цитата Сообщение от Aderom Посмотреть сообщение
Вылет
Ну а в file_in добавил?

Сделай
C++
1
zavod* arr = new zavod[50]{};
И проверяй этот farm на nullptr перед обращением
0
1 / 1 / 0
Регистрация: 02.07.2020
Сообщений: 42
21.09.2020, 20:58  [ТС] 5
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Ну а в file_in добавил?
-_-
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
И проверяй этот farm на nullptr перед обращением
if (arr[k].farm == nullptr)
{
записать
}
else ???
0
6565 / 4550 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
21.09.2020, 21:00 6
Цитата Сообщение от Aderom Посмотреть сообщение
Ну а в file_in добавил?
-_-
Покажи file_in
0
1 / 1 / 0
Регистрация: 02.07.2020
Сообщений: 42
21.09.2020, 21:05  [ТС] 7
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Покажи file_in
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
void file_in(zavod* arr, int i)
{
    ifstream file("1.txt");
    int k = 0;
 
    if (!file)
    {
        ;
    }
    else
    {
        while(!file.eof())
        {
            while (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();
}
Добавлено через 1 минуту
Так, запустил прогу, теперь он зависает. Не вылетает но и нельзя ввести переменную для работы с меню
0
6565 / 4550 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
21.09.2020, 21:06 8
Не должна она здесь падать.
Увеличь ещё размер, на всякий случай arr[k].farm = new char[64]
0
1 / 1 / 0
Регистрация: 02.07.2020
Сообщений: 42
21.09.2020, 21:07  [ТС] 9
Я косякнул и в file_in написал выделение памяти с переменной i а не k
из-за этого вылетал

Добавлено через 25 секунд
Но как написал выше. Теперь просто висит

Он не возвращается из функции в main. значит кривое условие выхода.
0
6565 / 4550 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
21.09.2020, 21:10 10
Цитата Сообщение от Aderom Посмотреть сообщение
Но как написал выше. Теперь просто висит
Подозреваю, здесь. Вообще, зачем это?
Цитата Сообщение от Aderom Посмотреть сообщение
while (cin.get() != '\n')
            ;
0
1 / 1 / 0
Регистрация: 02.07.2020
Сообщений: 42
21.09.2020, 21:13  [ТС] 11
Обнаружил то что программа не видит конец файла
0
6565 / 4550 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
21.09.2020, 21:16 12
Цитата Сообщение от Aderom Посмотреть сообщение
Обнаружил то что программа не видит конец файла
Цитата Сообщение от Aderom Посмотреть сообщение
while(!file.eof())
        {
            while (k < i)
Убери цикл while(!file.eof())
0
1 / 1 / 0
Регистрация: 02.07.2020
Сообщений: 42
21.09.2020, 21:18  [ТС] 13
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Подозреваю, здесь. Вообще, зачем это?
Нет, не здесь. Эта строчка чистит символы которые могли остаться в буфере cin

При существующем файле, программа не может найти его конец. Удалил его, начал записывать новый, тепрь точно ская же проблема появилась в case_1 в строчке где запоминается farm
Наши действия перенесли проблему в другой участок

Добавлено через 53 секунды
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Убери цикл while(!file.eof())
Убрал
0
6565 / 4550 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
21.09.2020, 21:19 14
Цитата Сообщение от Aderom Посмотреть сообщение
При существующем файле, программа не может найти его конец. Удалил его, начал записывать новый, тепрь точно ская же проблема появилась в case_1 в строчке где запоминается farm
Наши действия перенесли проблему в другой участок
Никуда они ничего не переносили. Ты сам понаделал проблем и теперь натыкаешься на них по очереди.

Добавлено через 52 секунды
Во первых - убери вот это
Цитата Сообщение от Aderom Посмотреть сообщение
i = count();
0
1 / 1 / 0
Регистрация: 02.07.2020
Сообщений: 42
21.09.2020, 21:20  [ТС] 15
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Никуда они ничего не переносили. Ты сам понаделал проблем и теперь натыкаешься на них по очереди.
Не могу не согласиться.
0
6565 / 4550 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
21.09.2020, 21:20 16
Количество буквой i не называют
0
1 / 1 / 0
Регистрация: 02.07.2020
Сообщений: 42
21.09.2020, 21:21  [ТС] 17
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Во первых - убери вот это
И как мне определить сколько элементов структуры находится в файле
0
6565 / 4550 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
21.09.2020, 21:22 18
C++
1
2
3
    zavod* arr = new zavod[50];
    int n =  file_in(zavod* arr, 50);
    while (z != 6)
Переделай file_in - на входе массив и максимальный размер, на выходе - кол-во считанных из файла элементов

Добавлено через 37 секунд
Цитата Сообщение от Aderom Посмотреть сообщение
И как мне определить сколько элементов структуры находится в файле
Считывай, пока файл не закончится, но не больше 50-ти
0
1 / 1 / 0
Регистрация: 02.07.2020
Сообщений: 42
21.09.2020, 21:23  [ТС] 19
Хорошо, пробую
0
6565 / 4550 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
21.09.2020, 21:24 20
Удали вообще все функции, сделай сначала file_in, потом file_out, убедись что они работают и добавляй потом по-одной
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.09.2020, 21:24
Помогаю со студенческими работами здесь

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

Вызвано необработанное исключение: нарушение доступа для записи
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() {...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru