Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Rebel1994
0 / 0 / 0
Регистрация: 26.04.2014
Сообщений: 76
1

При использовании malloc и free, приложение прекращает свою работу

12.04.2015, 21:37. Просмотров 715. Ответов 15
Метки нет (Все метки)

Доброго времени суток, коллеги. Столкнулся с такой проблемой. При использовании malloc и free, приложение прекращает свою работу и выскакивает ошибка следующего содержания: "CRT detected that the application wrote to memory after end of heap buffer"

P.S. На уместность/неуместность динамического выделения памяти здесь можете не обращать внимание, мне просто нужно продемонстрировать умение (а, как оказалось, неумение) его использовать.

Заранее благодарю

Ошибка происходит вот в этом куске кода.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void newFile()
{
    int YesOrNot;
    FILE *f;
    char* file_name = (char*) malloc(sizeof(*file_name)); // выделяем динамическую память под название файла
    printf("Введите имя файла для записи информации: ");
    scanf("%s", file_name);
    f = fopen(file_name, "w");
    do
    {
        getdata();
        l++;
        printf("Продолжить ввод данных (1 - да, 0 - нет):"); //Заполняем массив структур пока пользователь не нажмет 0
        scanf("%d", &YesOrNot);
    } while (YesOrNot != 0);
    fclose(f);//закрываем файл
    free(file_name);
    *file_name = 0;
    printf("Вызываем writedata()");
    writedata(); //функция перезаписывает файл
 
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.04.2015, 21:37
Ответы с готовыми решениями:

Ошибка Invalid pointer при использовании malloc и struct
Здравствуйте. Написал программу для того, чтобы понять работу malloc. #include <stdio.h>...

Ошибка с выводом значений матр. при использовании malloc
Не получается организовать правильный ввод и вывод. Пример ввода: N=2; (1,2,3,4) Результат:...

Собственная реализация malloc, free
Нужно написать собственную реализацию malloc, free без использования calloc и всего подобного. Где...

Почему программа прекращает свою работу, не дойдя до конца конструктора
Инструкция по запуску: <имя.exe> <inputfilename> <outputfilename> <-s|-i> <-a|-d> Так как в...

Не прекращает работу приложение
Здравствуйте. Столкнулся с такой проблемой. Помогите, пожалуйста, разобраться. Написал диалог...

15
Jewbacabra
Эксперт PHP
3863 / 3183 / 1388
Регистрация: 24.04.2014
Сообщений: 9,679
12.04.2015, 21:59 2
Цитата Сообщение от Rebel1994 Посмотреть сообщение
C
1
char* file_name = (char*) malloc(sizeof(*file_name)); // выделяем динамическую память под название файла
тут всего 1 байт выделяется.
Цитата Сообщение от Rebel1994 Посмотреть сообщение
C
1
2
free(file_name);
*file_name = 0;
сначала память освобождена, потом туда что-то записывается.
0
Rebel1994
0 / 0 / 0
Регистрация: 26.04.2014
Сообщений: 76
12.04.2015, 22:04  [ТС] 3
На счёт одного байта - согласен. А по поводу второго я прочитал, что якобы "После освобождения памяти, хорошей практикой является сброс указателя в нуль, то есть присвоить *ptrVar = 0. Если указателю присвоить 0, указатель становится нулевым, другими словами, он уже никуда не указывает. Всегда после высвобождения памяти, присваивайте указателю 0, в противном случае, даже после высвобождения памяти, указатель все равно на неё указывает, а значит вы случайно можете нанести вред другим программам, которые, возможно будут использовать эту память, но вы даже ничего об этом не узнаете и будете думать, что программа работает корректно."

Или так делать нельзя?
0
Jewbacabra
Эксперт PHP
3863 / 3183 / 1388
Регистрация: 24.04.2014
Сообщений: 9,679
12.04.2015, 22:06 4
Цитата Сообщение от Rebel1994 Посмотреть сообщение
После освобождения памяти, хорошей практикой является сброс указателя в нуль, то есть присвоить *ptrVar = 0.
C
1
ptrVal = NULL; // без *
0
12.04.2015, 22:06
Rebel1994
0 / 0 / 0
Регистрация: 26.04.2014
Сообщений: 76
12.04.2015, 22:39  [ТС] 5
Спасибо большое за подсказку. Проблема была решена следующим образом:
C
1
2
file_name = nullptr;
free(file_name);
Думаю, никакой разницы между Null и nullptr, нет. Не знаю, почему, но проблема решилась именно заменой строк.
0
Jewbacabra
Эксперт PHP
3863 / 3183 / 1388
Регистрация: 24.04.2014
Сообщений: 9,679
12.04.2015, 23:07 6
Цитата Сообщение от Rebel1994 Посмотреть сообщение
Проблема была решена следующим образом
так утечка памяти будет.
сначала освободить, потом обнулить.
Цитата Сообщение от Rebel1994 Посмотреть сообщение
Думаю, никакой разницы между Null и nullptr, нет
nullptr к C отношения не имеет, появился в C++11 и это не тоже самое что NULL.
0
Rebel1994
0 / 0 / 0
Регистрация: 26.04.2014
Сообщений: 76
13.04.2015, 08:29  [ТС] 7
Но при такой последовательности операторов у меня всё равно выскакивает эта ошибка и приложение прекращает работу... Оно-то всё логично. Но ошибки не возникает именно при замене операторов местами...
0
Jewbacabra
Эксперт PHP
3863 / 3183 / 1388
Регистрация: 24.04.2014
Сообщений: 9,679
13.04.2015, 08:45 8
Цитата Сообщение от Rebel1994 Посмотреть сообщение
Но ошибки не возникает именно при замене операторов местами...
значит ошибка в другом месте
0
HighPredator
5698 / 2022 / 723
Регистрация: 10.12.2010
Сообщений: 5,798
Записей в блоге: 3
13.04.2015, 10:13 9
Цитата Сообщение от Rebel1994 Посмотреть сообщение
у меня всё равно выскакивает эта ошибка и приложение прекращает работу
Измененный код в студию.
0
Rebel1994
0 / 0 / 0
Регистрация: 26.04.2014
Сообщений: 76
14.04.2015, 14:42  [ТС] 10
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void newFile()
{
    int YesOrNot;
    FILE *f;
    char* file_name = (char*) malloc(1); 
    printf("Какой-то текст");
    scanf("%s", file_name);
    f = fopen(file_name, "w");
    do
    {
        getdata();
        l++;
        printf("Опять какой-то текст"); 
        scanf("%d", &YesOrNot);
    } while (YesOrNot != 0);
    fclose(f);
        free(file_name);    
        file_name = NULL;   
    writedata(); 
}
Если так, сначала очистить, а потом обнулить, всё равно выскакивает ошибка при выполнении программы.
0
Jewbacabra
Эксперт PHP
3863 / 3183 / 1388
Регистрация: 24.04.2014
Сообщений: 9,679
14.04.2015, 14:54 11
Цитата Сообщение от Rebel1994 Посмотреть сообщение
C
1
char* file_name = (char*) malloc(1);
в 1 байт имя файла не влезет. Попробуй 100, хотя это тоже плохое решение
0
HighPredator
5698 / 2022 / 723
Регистрация: 10.12.2010
Сообщений: 5,798
Записей в блоге: 3
14.04.2015, 14:56 12
getdata(); Вот это покажите.
0
Rebel1994
0 / 0 / 0
Регистрация: 26.04.2014
Сообщений: 76
15.04.2015, 18:03  [ТС] 13
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
void getdata()  //заполнение элементов массива структур информацией о посетителях
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    printf("Заполните данные клиента первой поликлиники\n");
    printf("---------------------------------------------------\n");
    printf("Ф. И. О.: ");
    scanf("%s %s %s", &(temp[0][l].Client.Surname), &(temp[0][l].Client.Name), &(temp[0][l].Client.FathName));
    printf("Дата рождения: ");
    scanf("%d/%d/%d", &(temp[0][l].date_birth.day), &(temp[0][l].date_birth.month), &(temp[0][l].date_birth.year));
    printf("Дата поступления: ");
    scanf("%d/%d/%d", &(temp[0][l].date_arrive.day), &(temp[0][l].date_arrive.month), &(temp[0][l].date_arrive.year));
    printf("Фамилия  врача: ");
    scanf("%s", &temp[0][l].Doctor.Surname);
 
    int ans = 0;
    do
    {
        printf("Ввести данные клиента второй поликлиники? (1 - да, 0 - нет):");
        scanf("%d", &ans);
    }while(ans > 1);
    
    if(ans == 1)
    {
        printf("Заполните данные клиента второй поликлиники\n");
        printf("---------------------------------------------------\n");
        printf("Ф. И. О.: ");
        scanf("%s %s %s", &(temp[1][k].Client.Surname), &(temp[1][k].Client.Name), &(temp[1][k].Client.FathName));
        printf("Дата рождения: ");
        scanf("%d/%d/%d", &(temp[1][k].date_birth.day), &(temp[1][k].date_birth.month), &(temp[1][l].date_birth.year));
        printf("Дата поступления: ");
        scanf("%d/%d/%d", &(temp[1][k].date_arrive.day), &(temp[1][k].date_arrive.month), &(temp[1][k].date_arrive.year));
        printf("Фамилия  врача: ");
        scanf("%s", &temp[1][k].Doctor.Surname);
        k++;
    }
    else
        return;
}
0
HighPredator
5698 / 2022 / 723
Регистрация: 10.12.2010
Сообщений: 5,798
Записей в блоге: 3
16.04.2015, 08:12 14
Тогда у вас что-то совсем не так. Потому, что от открытия файла до закрытия вы в него вообще ничего не пишете. Выложите вообще весь код.
0
Rebel1994
0 / 0 / 0
Регистрация: 26.04.2014
Сообщений: 76
16.04.2015, 08:51  [ТС] 15
А вот тут, я думаю, пора раскрыть карты. Дело в том, что одному студенту нужно было сделать контрольную работу по С. Задание к контрольной состояло из двух задач:
Учет посетителей поликлиники
Задание для контрольной работы №1
В соответствии с вариантом индивидуального задания, необходимо разработать консольное приложение на языке С.
Приложение должно предоставлять возможности:
-просмотра информации из текстового файла;
-добавления новых записей в файл;
-удаления записей из файла;
-редактирования записей в файле.
В работе предусмотреть использование:
- пользовательских функций;
-массивов;
-структур.
Задание для контрольной работы №2
Изменить программную реализацию из контрольной №1 следующим образом:
- предусмотреть использование многомерных массивов;
-предусмотреть динамическое использование памяти;
-предусмотреть использование указателей на функции;
-разделить проект на несколько компонентов, которые используются через директиву #include

Первую задачу решал не я, а какой-то другой прогер, поэтому в реализацию всех функций я толком не вникал, хотя меня тоже насторожило, что в этой функции ничего в файл не записывается. Там есть функция writedata(), но она вызывается уже после освобождения памяти.. .Но я не стал исправлять, потому что мы с этим студентом на это не договаривались, соответственно и заплатит он мне только за вторую задачу. Да и вообще меня многое смущает в коде, котором писал другой прогер, но что поделаешь...

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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <malloc.h>// для использования malloc и free
#include <string>
#include <conio.h>
#include "iostream"
#include"locale.h"
#include"windows.h"
#include "Hospital_clients.h" //подключаем файл определения структуры Hospital_clients
 
int l = 0; // следит за количеством заполненных структур первой поликлиники
int k = 0; // следит за количеством заполненных структур второй поликлиники
hospital_clients temp[2][100]; //массив структур 
//прототипы функций
int menu();
void newFile();
void viewFile();
void addFile();
void editFile();
void deleterecord();
void writedata();
void getdata();
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);//настройки для корректной записи информации на кириллице в файл
    system("mode con cols=100 lines=30");//расширяем окно консоли, чтобы поместилась таблица
 
    // Объявляем указатели на функции и инициализируем соответствующими функциями
    void (*pnewFile)() = newFile;
    void (*pviewFile)() = viewFile;
    void (*paddFile)() = addFile;
    void (*peditFile)() = editFile;
    void (*pdeleteRecord)() = deleterecord;
    void (*pwriteData)() = writedata;
    void (*pgetData)() = getdata;
    
    switch (menu()) //вызов меню
    {
        case 1:(*pnewFile)(); break; //Вызываем функции через указатель
        case 2:(*pviewFile)(); break;
        case 3:(*paddFile)(); break;
        case 4:(*peditFile)(); break;
        case 5:(*pdeleteRecord)(); break;
        case 6: return 0;
        default:printf("Неверный выбор\n");
    }
    _getch();
}
void getdata()  //заполнение элементов массива структур информацией о посетителях
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    printf("Заполните данные клиента первой поликлиники\n");
    printf("---------------------------------------------------\n");
    printf("Ф. И. О.: ");
    scanf("%s %s %s", &(temp[0][l].Client.Surname), &(temp[0][l].Client.Name), &(temp[0][l].Client.FathName));
    printf("Дата рождения: ");
    scanf("%d/%d/%d", &(temp[0][l].date_birth.day), &(temp[0][l].date_birth.month), &(temp[0][l].date_birth.year));
    printf("Дата поступления: ");
    scanf("%d/%d/%d", &(temp[0][l].date_arrive.day), &(temp[0][l].date_arrive.month), &(temp[0][l].date_arrive.year));
    printf("Фамилия  врача: ");
    scanf("%s", &temp[0][l].Doctor.Surname);
 
    int ans = 0;
    do
    {
        printf("Ввести данные клиента второй поликлиники? (1 - да, 0 - нет):");
        scanf("%d", &ans);
    }while(ans > 1);
    
    if(ans == 1)
    {
        printf("Заполните данные клиента второй поликлиники\n");
        printf("---------------------------------------------------\n");
        printf("Ф. И. О.: ");
        scanf("%s %s %s", &(temp[1][k].Client.Surname), &(temp[1][k].Client.Name), &(temp[1][k].Client.FathName));
        printf("Дата рождения: ");
        scanf("%d/%d/%d", &(temp[1][k].date_birth.day), &(temp[1][k].date_birth.month), &(temp[1][l].date_birth.year));
        printf("Дата поступления: ");
        scanf("%d/%d/%d", &(temp[1][k].date_arrive.day), &(temp[1][k].date_arrive.month), &(temp[1][k].date_arrive.year));
        printf("Фамилия  врача: ");
        scanf("%s", &temp[1][k].Doctor.Surname);
        k++;
    }
    else
        return;
}
void writedata()
{
    FILE *f;
    f = fopen("pkp.txt", "w");//создаем файл pkp.txt(сохраняется в корневой папке проекта)
    fprintf(f,"Данные первой поликлиники\n\n");
    fprintf(f, "№ || Фамилия         ||Имя           ||Отчество      ||Дата рождения|| Поступил || Врач           ||\n"); //Шапка таблицы
    fprintf(f, "==++=================++==============++==============++=============++==========++================||\n");
    for (int i = 0; i < l; i++)//записываем данные в файл
    {
        fprintf(f, "%2d||%17s||%14s||%14s||%5.2d.%2.2d.%4.4d||%2.2d.%2.2d.%4.4d||%16s||\n", (i + 1), temp[0][i].Client.Surname, 
            temp[0][i].Client.Name, temp[0][i].Client.FathName, temp[0][i].date_birth.day, temp[0][i].date_birth.month,
            temp[0][i].date_birth.year, temp[0][i].date_arrive.day, temp[0][i].date_arrive.month, temp[0][i].date_arrive.year,
            temp[0][i].Doctor.Surname);// форматированный вывод данных
        fprintf(f, "==++=================++==============++==============++=============++==========++================||\n");
    }
 
    fprintf(f,"Данные второй поликлиники\n\n");
    fprintf(f, "№ || Фамилия         ||Имя           ||Отчество      ||Дата рождения|| Поступил || Врач           ||\n"); //Шапка таблицы
    fprintf(f, "==++=================++==============++==============++=============++==========++================||\n");
    for (int i = 0; i < k; i++)//записываем данные в файл
    {
        fprintf(f, "%2d||%17s||%14s||%14s||%5.2d.%2.2d.%4.4d||%2.2d.%2.2d.%4.4d||%16s||\n", (i + 1), temp[1][i].Client.Surname, 
            temp[1][i].Client.Name, temp[1][i].Client.FathName, temp[1][i].date_birth.day, temp[1][i].date_birth.month,
            temp[1][i].date_birth.year, temp[1][i].date_arrive.day, temp[1][i].date_arrive.month, temp[1][i].date_arrive.year,
            temp[1][i].Doctor.Surname);// форматированный вывод данных
        fprintf(f, "==++=================++==============++==============++=============++==========++================||\n");
    }
    fclose(f);//закрываем файл
}
int menu()
{
 
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    int choice;
    do
    {
        system("cls");//очищает содержание экрана
        printf("Меню\n");
        printf("1.Новый файл\n"); //Ввод массива структур и запись в файл
        printf("2.Показать файл\n");//Считывание из файла и вывод на экран
        printf("3.Добавить запись\n");//Добавление новых данных
        printf("4.Редактировать запись\n");//Изменение записи по порядковому номеру
        printf("5.Удалить запись\n");//Удаление записи о клиенте по порядковому номеру
        printf("6.Выход\n");
        printf("Ваш выбор: ");
        scanf("%d", &choice);//ввод действия, которое хотим произвести
        system("cls");
    } while (choice > 6);
    return choice;
}
void newFile()
{
    int YesOrNot;
    FILE *f;
    char* file_name = (char*) malloc(1); // выделяем динамическую память под название файла
    printf("Введите имя файла для записи информации: ");
    scanf("%s", file_name);
    f = fopen(file_name, "w");
    do
    {
        getdata();
        l++;
        printf("Продолжить ввод данных о первой поликлинике? (1 - да, 0 - нет):"); //Заполняем массив структур пока пользователь не нажмет 0
        scanf("%d", &YesOrNot);
    } while (YesOrNot != 0);
    fclose(f);//закрываем файл
    file_name = NULL; //обнуляем указатель
    free(file_name);    //Освобождаем память, выделенную под указатель
    writedata(); //функция перезаписывает файл
}
void viewFile()
{
 
    FILE *f;
    char* file_name = (char*) malloc(1); // выделяем динамическую память под название файла
    printf("Введите имя файла: ");
    scanf("%s", file_name);
    f = fopen(file_name, "r");//фай открыт только для чтения
    if (f == NULL)
        printf("Файл занят другой программой или не существует\n");//проверяем, существует ли файл, если нет-выдается сообщение
    else
    {
 
        for (int i = 0; i < l; i++)//в этом цикле считываем данные о первой поликлинике из файла в структуру
        {
            fscanf(f, "  ||%17s||%14s||%14s||%5d.%2d.%4d||%2d.%2d.%4d||%16s||\n", temp[0][i].Client.Surname, temp[0][i].Client.Name,
                temp[0][i].Client.FathName, &temp[0][i].date_birth.day, &temp[0][i].date_birth.month, &temp[0][i].date_birth.year,
                &temp[0][i].date_arrive.day, &temp[0][i].date_arrive.month, &temp[0][i].date_arrive.year, temp[0][i].Doctor.Surname);
        }
 
        for (int i = 0; i < k; i++)//в этом цикле считываем данные о второй поликлинике из файла в структуру
        {
            fscanf(f, "  ||%17s||%14s||%14s||%5d.%2d.%4d||%2d.%2d.%4d||%16s||\n", temp[1][i].Client.Surname, temp[1][i].Client.Name,
                temp[1][i].Client.FathName, &temp[1][i].date_birth.day, &temp[1][i].date_birth.month, &temp[1][i].date_birth.year,
                &temp[1][i].date_arrive.day, &temp[1][i].date_arrive.month, &temp[1][i].date_arrive.year, temp[1][i].Doctor.Surname);
        }
        printf("Данные перовой поликлиники\n");
        printf("------------------------------------------\n");
        printf("№ || Фамилия         ||Имя           ||Отчество      ||Дата рождения|| Поступил || Врач           ||\n");
        printf("==++=================++==============++==============++=============++==========++================||\n");
        for (int i = 0; i < l; i++)//выводим структуру на экран
        {
            printf("%2d||%17s||%14s||%14s||%5d.%2.2d.%4d||%2d.%2.2d.%4d||%16s||\n", i + 1, temp[0][i].Client.Surname, temp[0][i].Client.Name,
                temp[0][i].Client.FathName, temp[0][i].date_birth.day, temp[0][i].date_birth.month, temp[0][i].date_birth.year,
                temp[0][i].date_arrive.day, temp[0][i].date_arrive.month, temp[0][i].date_arrive.year, temp[0][i].Doctor.Surname);
            printf("==++=================++==============++==============++=============++==========++================||\n");
        }
 
        printf("Данные второй поликлиники\n");
        printf("------------------------------------------\n");
        printf("№ || Фамилия         ||Имя           ||Отчество      ||Дата рождения|| Поступил || Врач           ||\n");
        printf("==++=================++==============++==============++=============++==========++================||\n");
        for (int i = 0; i < k; i++)//выводим структуру на экран
        {
            printf("%2d||%17s||%14s||%14s||%5d.%2.2d.%4d||%2d.%2.2d.%4d||%16s||\n", i + 1, temp[1][i].Client.Surname, temp[1][i].Client.Name,
                temp[1][i].Client.FathName, temp[1][i].date_birth.day, temp[1][i].date_birth.month, temp[1][i].date_birth.year,
                temp[1][i].date_arrive.day, temp[1][i].date_arrive.month, temp[1][i].date_arrive.year, temp[1][i].Doctor.Surname);
            printf("==++=================++==============++==============++=============++==========++================||\n");
        }
        fclose(f);//закрываем файл
        file_name = NULL; //Обнуляем указатель
        free(file_name);    //Освобождаем память, выделенную под указатель
    }
 
 
    _getch();
}
Продолжение на следующем посте, так как превышен лимит символов в 15000...
0
Rebel1994
0 / 0 / 0
Регистрация: 26.04.2014
Сообщений: 76
16.04.2015, 08:51  [ТС] 16
Продолжение...
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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
void addFile()
{
    int YesOrNot;
    FILE *f;
    char* file_name = (char*) malloc(sizeof(*file_name)); // выделяем динамическую память под название файла
    printf("Введите имя файла для записи информации: ");
    scanf("%s", file_name);
 
    f = fopen(file_name, "at");//файл открыт для  записи в конец файла
    int i;
    i = l;
    f = fopen("pkp.txt", "r");//файл открыт только для чтения
    if (f == NULL)
        printf("Файл занят дргой программой или не существует\n");//проверяем, существует ли файл, если нет-выдается сообщение
 
    else
    {
        do{
            //до записываем
            getdata();
            l++;
            printf("Продолжить ввод данных (1 - да, 0 - нет): ");
            scanf("%d", &YesOrNot);
        } while (YesOrNot != 0);
        fclose(f);
        file_name = NULL; //Обнуляем
        free(file_name);    //Освобождаем
        writedata();
    }
    _getch();
}
void editFile()
{
    int q;
    FILE *f;
    char* file_name = (char*) malloc(sizeof(*file_name)); // выделяем динамическую память под название файла
    printf("Введите имя файла для записи информации: ");
    scanf("%s", file_name);
    f = fopen(file_name, "r"); //открываем файл для чтения
    if (f == NULL)
        printf("Файл занят другой программой или не существует\n");//проверяем, существует ли файл, если нет-выдается сообщение
    else
    {
        printf("Введите номер записи из данных первой поликлиники, которую хотите изменить\n");
        scanf("%d", &q);
        if (q - 1 < l)//смотрим, не превышает ли введённое число количество структур, которое у нас имеется
            //q-1 так отсчет элементов в массиве начинается с 0
        {
            for (int i = 0; i < l; i++)//в этом цикле считываем данные из файла в структуру
            {
                fscanf(f, "  ||%17s||%14s||%14s||%5d.%2d.%4d||%2d.%2d.%4d||%16s||\n", temp[0][i].Client.Surname, temp[0][i].Client.Name,
                    temp[0][i].Client.FathName, &temp[0][i].date_birth.day, &temp[0][i].date_birth.month, &temp[0][i].date_birth.year,
                    &temp[0][i].date_arrive.day, &temp[0][i].date_arrive.month, &temp[0][i].date_arrive.year, temp[0][i].Doctor.Surname);
                if (i == q - 1)
                {
                    printf("Ф. И. О.: ");
                    scanf("%s %s %s", &(temp[0][i].Client.Surname), &(temp[0][i].Client.Name), &(temp[0][i].Client.FathName));
                    printf("Дата рождения: ");
                    scanf("%d/%d/%d", &(temp[0][i].date_birth.day), &(temp[0][i].date_birth.month), &(temp[0][i].date_birth.year));
                    printf("Дата поступления: ");
                    scanf("%d/%d/%d", &(temp[0][i].date_arrive.day), &(temp[0][i].date_arrive.month), &(temp[0][i].date_arrive.year));
                    printf("Фамилия  врача: ");
                    scanf("%s", &temp[0][i].Doctor.Surname);
                    fprintf(f, "%2d||%17s||%14s||%14s||%5d.%2d.%4d||%2d.%2d.%4d||%16s||\n", i + 1, temp[0][i].Client.Surname,
                        temp[0][i].Client.Name, temp[0][i].Client.FathName, &temp[0][i].date_birth.day, &temp[0][i].date_birth.month,
                        &temp[0][i].date_birth.year, &temp[0][i].date_arrive.day, &temp[0][i].date_arrive.month, 
                        &temp[0][i].date_arrive.year, temp[0][i].Doctor.Surname);
                }
            }
        }
 
        else//если количество структур меньше введённого числа, то мы выдаем ошибку и выходим из программы
        {
            printf("Ошибка: такого элемента не существует");
            exit(1);
        }
 
        printf("Введите номер записи из данных второй поликлиники, которую хотите изменить\n");
        scanf("%d", &q);
        if (q - 1 < k)//смотрим, не превышает ли введённое число количество структур, которое у нас имеется
            //q-1 так отсчет элементов в массиве начинается с 0
        {
            for (int i = 0; i < k; i++)//в этом цикле считываем данные из файла в структуру
            {
                fscanf(f, "  ||%17s||%14s||%14s||%5d.%2d.%4d||%2d.%2d.%4d||%16s||\n", temp[1][i].Client.Surname, temp[1][i].Client.Name,
                    temp[1][i].Client.FathName, &temp[1][i].date_birth.day, &temp[1][i].date_birth.month, &temp[1][i].date_birth.year,
                    &temp[1][i].date_arrive.day, &temp[1][i].date_arrive.month, &temp[1][i].date_arrive.year, temp[1][i].Doctor.Surname);
                if (i == q - 1)
                {
                    printf("Ф. И. О.: ");
                    scanf("%s %s %s", &(temp[1][i].Client.Surname), &(temp[1][i].Client.Name), &(temp[1][i].Client.FathName));
                    printf("Дата рождения: ");
                    scanf("%d/%d/%d", &(temp[1][i].date_birth.day), &(temp[1][i].date_birth.month), &(temp[1][i].date_birth.year));
                    printf("Дата поступления: ");
                    scanf("%d/%d/%d", &(temp[1][i].date_arrive.day), &(temp[1][i].date_arrive.month), &(temp[1][i].date_arrive.year));
                    printf("Фамилия  врача: ");
                    scanf("%s", &temp[1][i].Doctor.Surname);
                    fprintf(f, "%2d||%17s||%14s||%14s||%5d.%2d.%4d||%2d.%2d.%4d||%16s||\n", i + 1, temp[1][i].Client.Surname,
                        temp[1][i].Client.Name, temp[1][i].Client.FathName, &temp[1][i].date_birth.day, &temp[1][i].date_birth.month,
                        &temp[1][i].date_birth.year, &temp[1][i].date_arrive.day, &temp[1][i].date_arrive.month, 
                        &temp[1][i].date_arrive.year, temp[1][i].Doctor.Surname);
                }
            }
            writedata();//Перезаписываем файл
            fclose(f);
            file_name = NULL; //Обнуляем
            free(file_name);    //Освобождаем
 
        }
        else//если количество структур меньше введённого числа, то мы выдаем ошибку и выходим из программы
        {
            printf("Ошибка: такого элемента не существует");
            exit(1);
        }
    }
    _getch();
}
void deleterecord()
{
    
    FILE *f;
    char* file_name = (char*) malloc(sizeof(*file_name)); // выделяем динамическую память под название файла
    printf("Введите имя файла для записи информации: ");
    scanf("%s", file_name);
    f = fopen(file_name, "r"); //открываем файл только для чтения
    int q;
    if (f == NULL)
        printf("Файл занят другой программой или не существует\n");//проверяем, существует ли файл, если нет-выдается сообщение
    else
    {
        printf("Введите порядковый номер записи, которую хотите удалить из данных первой поликлиники\n");
        scanf("%d", &q);//вводим порядковый номер структуры, который хотим удалить
        if (q - 1 < l)//проверяет, не больше ли введённое нами число количества структур. Если больше то выдает ошибку, если меньше то удаляет
        {
            for (int i = 0; i < l; i++) //считываем файл в массив структур
            {
                fscanf(f, "  ||%17s||%14s||%14s||%5d.%2d.%4d||%2d.%2d.%4d||%16s||\n", temp[0][i].Client.Surname,
                    temp[0][i].Client.Name, temp[0][i].Client.FathName, &temp[0][i].date_birth.day,
                    &temp[0][i].date_birth.month, &temp[0][i].date_birth.year, &temp[0][i].date_arrive.day,
                    &temp[0][i].date_arrive.month, &temp[0][i].date_arrive.year, temp[0][i].Doctor.Surname);
            }
            for (int i = q - 1; i < l - 1; i++)
 
                temp[0][i] = temp[0][i + 1];
            l--;
        }
        else//если введённое число больше количества структур
            printf("Ошибка: такого элемента не существует");
 
        printf("Введите порядковый номер записи, которую хотите удалить из данных второй поликлиники\n");
        scanf("%d", &q);//вводим порядковый номер структуры, который хотим удалить
        if (q - 1 < k)//проверяет, не больше ли введённое нами число количества структур. Если больше то выдает ошибку, если меньше то удаляет
        {
            for (int i = 0; i < k; i++) //считываем файл в массив структур
            {
                fscanf(f, "  ||%17s||%14s||%14s||%5d.%2d.%4d||%2d.%2d.%4d||%16s||\n", temp[1][i].Client.Surname,
                    temp[1][i].Client.Name, temp[1][i].Client.FathName, &temp[1][i].date_birth.day,
                    &temp[1][i].date_birth.month, &temp[1][i].date_birth.year, &temp[1][i].date_arrive.day,
                    &temp[1][i].date_arrive.month, &temp[1][i].date_arrive.year, temp[1][i].Doctor.Surname);
            }
            for (int i = q - 1; i < k - 1; i++)
 
                temp[1][i] = temp[1][i + 1];
            k--;
            fclose(f);
            writedata();
        }
        else//если введённое число больше количества структур
            printf("Ошибка: такого элемента не существует");
    }
    file_name = NULL;   //Обнуляем
    free(file_name);    //Освобождаем
    _getch();
}
0
16.04.2015, 08:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.04.2015, 08:51

Прекращает работу программы при обращении к QTableWidget
Доброго времени суток тем кто посетил эту тему, возникла проблема, если вставить строку:...

Приложение внезапно завершает свою работу
Добрый день! Столкнулся с такой проблемой. Пишу какую-то программу. Всё компилируеться нормально...

Приложение самостоятельно завершает свою работу
Написал приложение Windows Form, которое считывает буфер обмена(при его изменении) и сохраняет...


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

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

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