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

Запись и чтение структур в файлах

05.04.2020, 22:20. Показов 1333. Ответов 3

Author24 — интернет-сервис помощи студентам
Доброго времени суток. Бьюсь с проблемой уже больше недели, хотя, как мне кажется, уже верный код где-то рядом. Если кто поможет, то буду невероятно благодарен.
Суть в том, что требуется ввести данные с клавиатуры, записать их в файл, потом считать их, отобрать по определённому условию, отобранные данные записать в новый файл, считать этот новый файл и записать считанные данные в первый созданный файл. В моём коде всё работает, но перестало отбирать. Видимо данные не сохраняются. Нужно создать что ли вторую структуру для отобранных данных... И по окончании работы выдаёт ошибку "Run-Time Check Failure #2 - Stack around the variable 'File' was corrupted."
Как-то всё слишком печально
Пример вводимых данных:
Введите путь: E:\
Введите имя файла основных данных: Test1.txt
OK! Файл создан и находится в E:\Test1.txt
1 студент. Введите Ф.И.О.: Kadyrov R.A.
Введите пол: m
Введите образование: s
Введите адрес: St.Petersburg
Получает ли студент стипендию? y
Введите дату рождения: 22 1 2001
Введите оценки студента: 4 5 5 5
Введите количество баллов: 228
2 студент. Введите Ф.И.О.: Afganistanov E.I.
Введите пол: m
Введите образование: s
Введите адрес: Grozniy
Получает ли студент стипендию? y
Введите дату рождения: 12 12 1994
Введите оценки студента: 5 4 5 5
Введите количество баллов: 282
Введите путь: E:\
Введите имя файла, который необходимо открыть: Test1.txt
OK! Файл открыт
Иногородних и окончивших среднюю школу: 0 ( должно быть в данном случае 1)
Введите путь для нового файла: E:\
Введите имя файла для отобранных данных: Test1-2.txt
OK! Файл создан и находится в E:\Test1-2.txt (здесь ошибку выдаёт)

Сам код:
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
#define _CRT_SECURE_NO_WARNINGS
 
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#include <iomanip>
#include <fstream>
 
#define NS 2
#define NFIO 20
#define M 4
#define ADR 25
 
struct Date {
    int Day;
    int Month;
    int Year;
};
 
struct Stud {
    char FIO[NFIO];
    char Pol;
    char Obr;
    char Adress[ADR];
    char Stip;
    Date DataR;
    int ocenki[M];
    int KB;
};
void vvod(Stud*);
void vivod(Stud*, int, char*);
int otbor(Stud*, Stud*, char*);
 
 
int main() {
    setlocale(LC_ALL, "ru");
    std::ofstream fout;
    char dir[20];
    char File[10];
    std::cout << "Введите путь: " << std::flush;
    std::cin >> dir;
    std::cout << "Введите имя файла основных данных: " <<std::flush;
    std::cin >> File;
    strcat(dir, File);
    fout.open(dir, std::ofstream::app);
    if (!fout.is_open())
    {
        std::cout << "Ошибка открытия файла! Пути нет" << std::endl;
        exit(EXIT_FAILURE);
    }
    else
    {
        Stud Group[NS]; Stud Group1[NS];
        std::cout << "OK! Файл создан и находится в " << dir << std::endl;
        vvod(Group);
        vivod(Group, NS, dir);
        int count = otbor(Group, Group1, dir);
    }
    fout.close();
    std::ifstream fin;
    std::cout << "Введите путь: " << std::flush;
    std::cin >> dir;
    std::cout << "Введите имя файла, который необходимо открыть: " << std::flush;
    std::cin >> File;
    strcat(dir, File);
    fin.open(dir);
    if (!fin.is_open())
    {
        std::cout << "Ошибка открытия файла! Пути нет" << std::endl;
        exit(EXIT_FAILURE);
    }
    else
    {
        Stud Group[NS]; Stud Group1[NS];
        std::cout << "OK! Файл открыт\n";
        int count = otbor(Group, Group1, dir);
        std::cout << "Иногородних и окончивших среднюю школу: " << count << std::endl;
        std::ofstream fout;
        std::cout << "Введите путь для нового файла: " << std::flush;
        std::cin >> dir;
        std::cout << "Введите имя файла для отобранных данных: " << std::flush;
        std::cin >> File;
        strcat(dir, File);
        fout.open(dir, std::ofstream::app);
        if (!fout.is_open())
        {
            std::cout << "Ошибка открытия файла! Пути нет" << std::endl;
            exit(EXIT_FAILURE);
        }
        else
        {
            Stud Group[NS]; Stud Group1[NS];
            std::cout << "OK! Файл создан и находится в " << dir << std::endl;
            vivod(Group1, count, dir);
        }
        fout.close();
    }
    fin.close();
    return (0);
}
 
void vvod(Stud* S) {
    int i;
    for (i = 0; i < NS; i++)
    {
        std::cin.get();
        std::cout << i + 1 << " студент. ";
        std::cout << "Введите Ф.И.О.: ";
        std::cin.getline(S[i].FIO, NFIO);
        std::cout << "Введите пол: ";
        std::cin >> S[i].Pol;
        std::cout << "Введите образование: ";
        std::cin >> S[i].Obr;
        std::cin.get();
        std::cout << "Введите адрес: ";
        std::cin.getline(S[i].Adress, ADR);
        std::cout << "Получает ли студент стипендию? ";
        std::cin >> S[i].Stip;
        std::cout << "Введите дату рождения: ";
        std::cin >> S[i].DataR.Day >> S[i].DataR.Month >> S[i].DataR.Year;
        std::cout << "Введите оценки студента: ";
        for (int k = 0; k < M; k++)
            std::cin >> S[i].ocenki[k];
        std::cout << "Введите количество баллов: ";
        std::cin >> S[i].KB;
 
    }
}
 
void vivod(Stud* S, int v, char* dir) {
    std::ofstream fout;
    fout.open(dir);
    fout.setf(std::ios::left);
    fout.width(22);
    fout << "F.I.O.";
    fout.width(6);
    fout << "Pol";
    fout.width(14);
    fout << "Obrazovaniye";
    fout.width(20);
    fout << "Adress";
    fout.width(5);
    fout << "Stip";
    fout.width(10);
    fout << "Data Rojdeniya ";
    fout.setf(std::ios::left);
    fout.width(12);
    fout << "Ocenki";
    fout.width(8);
    fout << "Bally";
    fout << std::endl;
    for (int i = 0; i < NS; i++) {
        fout.setf(std::ios::left);
        fout.width(22);
        fout << S[i].FIO;
        fout.width(5);
        fout << S[i].Pol << ' ';
        fout.width(13);
        fout << S[i].Obr << ' ';
        fout.width(19);
        fout << S[i].Adress << ' ';
        fout.width(4);
        fout << S[i].Stip << ' ';
        fout.width(2);
        fout << S[i].DataR.Day << '.';
        fout.width(2);
        fout << S[i].DataR.Month << '.';
        fout.width(8);
        fout << S[i].DataR.Year << ' ';
        for (int k = 0; k < M; k++)
            fout << S[i].ocenki[k] << "; ";
        fout << S[i].KB << std::endl;
    }
    fout.close();
}
 
int otbor(Stud* S, Stud* T, char* dir) {
    int count = 0, i;
    std::ifstream fin;
    fin.open(dir);
    for (i = 0; i < NS; i++) {
        if (S[i].Obr == 's' && strcmp(S[i].Adress, "St.Petersburg") != 0) {
            T[count] = S[i];
            count++;
        }
    }
    return count;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.04.2020, 22:20
Ответы с готовыми решениями:

Запись, чтение, изменение коментариев в файлах JPEG (JFIF)
Уважаеміе форумчане! Мне для собственных нужд нужно создать пограмму похожую на утилиту fototagger...

Чтение и запись массива структур
Добрый вечер! Прошу помощи, так как уже не знаю что делать: вот задание Данные о книгах на...

Запись и чтение структур данных
Изучаю структуры данных в C++. Решил написать программу, которая просто получает данные для...

Чтение и запись - при использовании структур
Товарищи подскажите, у меня есть своя структура: struct test { int T; int A0; int A1; };...

3
Параллельный Кот
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
05.04.2020, 23:57 2
Лучший ответ Сообщение было отмечено __marginal как решение

Решение

Цитата Сообщение от __marginal Посмотреть сообщение
"Run-Time Check Failure #2 - Stack around the variable 'File' was corrupted."
Цитата Сообщение от __marginal Посмотреть сообщение
C++
40
char File[10];
Цитата Сообщение от __marginal Посмотреть сообщение
Test1-2.txt
Сами догадаетесь или подсказать?

ɯǝʚɯо

Стек испорчен скорее всего значит, что где-то нарушены границы (выход за границы массива, например). Смотрим на размер File - 10 символов, включая терминальный 0, а имя файла имеет длину 11. Или имя файла короче вводите, или не используйте такие маленькие массивы для имен файлов. Например 256 (255 ограничение NTFS + 1 для нуля в конце строки).
1
0 / 0 / 0
Регистрация: 03.03.2020
Сообщений: 21
06.04.2020, 00:13  [ТС] 3
Цитата Сообщение от valen10 Посмотреть сообщение
Сами догадаетесь или подсказать?
Ой, да, действительно, размеров я пожалел. Спасибо)
Одной проблемой меньше!
0
0 / 0 / 0
Регистрация: 03.03.2020
Сообщений: 21
10.04.2020, 16:27  [ТС] 4
Проблема решена. Всем спасибо за участие!
0
10.04.2020, 16:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.04.2020, 16:27
Помогаю со студенческими работами здесь

Clipboard (запись/чтение) массива структур
Привет, форумчане! Прошу консультации по работе с буфером обмена Windows. Нужно корректно...

Запись/чтение структур из файла с произвольным доступом
Всем привет! Возникла проблема. Необходимо реализовать чтение и запись структур в файл с...

Запись/чтение массива структур в бинарный файл
#include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; struct test { int x; ...

Запись и чтение вектора структур в бинарный файл(2)
Есть заполненный вектор структур. Структура вида: struct struc { string a; int x; ...

Запись и чтение вектора структур в бинарный файл
Есть заполненный вектор структур. Структура вида: struct struc { string a; int x; map&lt;int,...

Чтение данных из файла, запись в массив структур
Всем привет, помогите, пожалуйста, с программой. Суть такова: имеется файл вида нужно...


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

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

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