Статья:

Работа с массивами данных через файл на языке С++

Журнал: Научный журнал «Студенческий форум» выпуск №16(37)

Рубрика: Технические науки

Выходные данные
Малкова Л.Е. Работа с массивами данных через файл на языке С++ // Студенческий форум: электрон. научн. журн. 2018. № 16(37). URL: https://nauchforum.ru/journal/stud/37/39861 (дата обращения: 25.04.2024).
Журнал опубликован
Мне нравится
на печатьскачать .pdfподелиться

Работа с массивами данных через файл на языке С++

Малкова Лилия Евгеньевна
студент, Санкт-Петербургский Государственный Университет Аэрокосмического Приборостроения, РФ, Санкт-Петербург

 

В данной статье произведен анализ задачи, для которой требовалось написать программу, которая з­­­­апрашивает у пользователя имя, фамилию, дату рождения, номер группы и записывает данные в файл. Программа должна осуществлять поиск по полученному файлу с возможностью редактирования отдельных данных пользователя.

Для реализации задачи на языке С++ требуется подключение стандартного заголовка <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. Данный код может быть применен для создания массивов данных при создании различных списков. Количество столбцов – регулируемое. Легко создать необходимые столбцы и их наименование. Водимые данные хранятся в файле, что дает им защиту и позволяет длительно их хранить даже на съемных носителях, т.к. пользователь сам выбирает место создания и хранения файла.

 

Список литературы:
1. Прата С. Язык программирования C++ : Издательство «Вильямс», 2017, 1248 с.