Работа с массивами данных через файл на языке С++
Журнал: Научный журнал «Студенческий форум» выпуск №16(37)
Рубрика: Технические науки
Научный журнал «Студенческий форум» выпуск №16(37)
Работа с массивами данных через файл на языке С++
В данной статье произведен анализ задачи, для которой требовалось написать программу, которая запрашивает у пользователя имя, фамилию, дату рождения, номер группы и записывает данные в файл. Программа должна осуществлять поиск по полученному файлу с возможностью редактирования отдельных данных пользователя.
Для реализации задачи на языке С++ требуется подключение стандартного заголовка <stdio.h>. Также, для задержки экрана консоли можно использовать функцию getch(), для этого нужно подключить библиотеку <conio.h>.
Обязательно использование пространства имён (namespace), оно создаёт декларативную область, в которой могут размещаться различные элементы программы. В пространстве имён std объявлена вся библиотека стандарта С++, таким образом упрощается доступ к стандартной библиотеке языка. Для использования функции strcat() – функция конкатенации, следует включить заголовок <string.h>.
Код программы:
1. #include <stdio.h>
2. #include <conio.h>
3. #include <string.h>
4. #include <iostream>
5. #define NFI 15
6. typedef struct
7. {
8. int Day, Month, Year;
9. }
10. Date;
11. typedef struct
12. {
13. int N;
14. char F[NFI];
15. char I[NFI];
16. Date DateR;
17. int Gr;
18. }
19. stud;
20. int main()
21. {
22. FILE*Fln;
23. int i, n, NS, choice;
24. char Dir[30], FileName[10], otv;
25. printf("Введите путь:\n");
26. scanf("%s", Dir);
27. printf("Введите имя файла\n");
28. scanf("%s", FileName);
29. strcat(Dir, FileName);
30. printf("Проверка пути\n");
31. if (Fln == NULL)
32. {
33. printf("Пути нет!\n");
34. return 1;
35. }
36. else
37. printf("Okey\n\nПуть = %s\n", Dir);
38. printf("Введите количество студентов в списке:\n");
39. scanf("%i", &NS);
40. printf("\n");
41. stud Group[NS];
42. printf("Введите имя, фамилию, д/р, № группы\n");
43. printf("№ Иванов___ Иван_____ 1 1 1996 2222\n");
44. printf("--------------------------------------\n");
45. for (i=0; i<NS; i++)
46. scanf("%i %s %s %i %i %i %i", &Group[i].N, Group[i].F, Group[i].I, &Group[i].DateR.Day,
47. &Group[i].DateR.Month, &Group[i].DateR.Year, &Group[i].Gr);
48. printf(" \n");
49. printf ("\n Хотите исправить данные? 'D' / 'N' \n");
50. otv = getch();
51. if (toupper(otv) == 'D')
52. {
53. Fln=fopen(Dir,"w");
54. do
55. {
56. printf ("\n Введите номер студента, которого хотите исправить: \n");
57. scanf("%i",&n);
58. if (NS>=n)
59. {
60. for (i=0; i<NS; i++)
61. {
62. if (Group[i].N == n)
63. {
64. printf("\nСтудент:\n");
65. printf("%i %s %s %i %i %i %i \n", Group[i].N, Group[i].F, Group[i].I,
66. Group[i].DateR.Day, Group[i].DateR.Month, Group[i].DateR.Year, Group[i].Gr);
67.
68. printf("\nВыберите из списка, что хотите исправить (1-4):\n");
69. printf("1 - фамилия\n2 - имя\n3 - д/р\n4 - № группы\n");
70. do
71. {
72. scanf("%i", &choice);
73. switch(choice)
74. {
75. case 1:
76. {
77. fprintf(Fln,"%i ", Group[i].N);
78. printf("Введите фамилию:\n");
79. scanf("%s", &Group[i].F);
80. fprintf(Fln,"%s ", Group[i].F);
81. fprintf(Fln,"%s %i %i %i %i \n", Group[i].I, Group[i].DateR.Day,
82. Group[i].DateR.Month, Group[i].DateR.Year, Group[i].Gr);
83. }
84. break;
85. case 2:
86. {
87. fprintf(Fln,"%i %s ", Group[i].N, Group[i].F);
88. printf("Введите имя:\n");
89. scanf("%s", &Group[i].I);
90. fprintf(Fln,"%s ", Group[i].I);
91. fprintf(Fln,"%i %i %i %i \n", Group[i].DateR.Day,
92. Group[i].DateR.Month, Group[i].DateR.Year, Group[i].Gr);
93. }
94. break;
95. case 3:
96. {
97. fprintf(Fln,"%i %s %s ", Group[i].N, Group[i].F, Group[i].I);
98. printf("Введите дату:\n");
99. scanf("%i %i %i", &Group[i].DateR.Day,
100. &Group[i].DateR.Month, &Group[i].DateR.Year);
101. fprintf(Fln,"%i %i %i ", Group[i].DateR.Day,
102. Group[i].DateR.Month, Group[i].DateR.Year);
103. fprintf(Fln,"%i \n", Group[i].Gr);
104. }
105. break;
106. case 4:
107. {
108. fprintf(Fln,"%i %s %s %i %i %i \n", Group[i].N, Group[i].F, Group[i].I,
109. Group[i].DateR.Day, Group[i].DateR.Month, Group[i].DateR.Year);
110. printf("Введите № группы:\n");
111. scanf("%i", &Group[i].Gr);
112. fprintf(Fln,"%i ", Group[i].Gr);
113. }
114. break;
115. default:
116. printf("Вы должны ввести число от 1 до 4 !\n");
117. }
118. }
119. while (choice>4);
120. }
121. else
122. {
123. fprintf(Fln,"%i %s %s %i %i %i %i \n", Group[i].N, Group[i].F, Group[i].I,
124. Group[i].DateR.Day, Group[i].DateR.Month, Group[i].DateR.Year, Group[i].Gr);
125. }
126. }
127. }
128. else
129. printf("\nТакой номер в списке не найден !\n");
130. }
131. while (NS<n);
132. }
133. else
134. {
135. for (i=0; i<NS; i++)
136. fprintf(Fln,"%i %s %s %i %i %i %i \n", Group[i].N, Group[i].F, Group[i].I,
137. Group[i].DateR.Day, Group[i].DateR.Month, Group[i].DateR.Year, Group[i].Gr);
138. }
139. fclose(Fln);
140. Fln=fopen(Dir,"r");
141. printf("\nok ! \nСписок:\n\n");
142. printf("-------------------------------------------\n");
143. for (i=0; i<NS; i++)
144. {
145. fscanf(Fln,"%i %s %s %i %i %i %i\n", &Group[i].N, &Group[i].F, &Group[i].I,
146. &Group[i].DateR.Day, &Group[i].DateR.Month, &Group[i].DateR.Year, &Group[i].Gr);
147. printf("%i %s %s %i %i %i %i \n", Group[i].N, Group[i].F, Group[i].I,
148. Group[i].DateR.Day, Group[i].DateR.Month, Group[i].DateR.Year, Group[i].Gr);
149. }
150. getch();
151. return 0; }
Работу данной программы можно увидеть на рисунке 1.
Рисунок 1. Скриншот консоли программы
Основной проблемой был учет всех нюансов, при выборе ответа пользователем, что привело к использованию нескольких конструкций do while. Данный код может быть применен для создания массивов данных при создании различных списков. Количество столбцов – регулируемое. Легко создать необходимые столбцы и их наименование. Водимые данные хранятся в файле, что дает им защиту и позволяет длительно их хранить даже на съемных носителях, т.к. пользователь сам выбирает место создания и хранения файла.