В двоичный файл записать Фамилию, Имя, Занимаемое место, упорядоченные по убыванию и вывести этот файл на экран - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Листинг программы
  1. // Sportsmens.cpp: определяет точку входа для консольного приложения.
  2. //даны количество спортсменов, количество видов спорта и записи (с консоли или текстового файла)
  3. //Фамилия Имя баллы(по каждому виду спорта)
  4. //в двоичный файл записать Фамилию Имя Занимаемое место, упорядоченные по убыванию и вывести этот файл на
  5. //экран
  6. #include "stdafx.h"
  7. #include <iostream>
  8. #include <string.h>
  9. struct sport
  10. {
  11. char sname[20];
  12. char name[20];
  13. int sum=0;
  14. };
  15. void swap(char* n, char* k);
  16. int sportsmen(sport* arr);
  17. void swap2(int& n, int& k);
  18. void sort(sport* arr, int numb);
  19. void vyvod_bin(sport* arr, char*name_out, int numb);
  20. int _tmain(int argc, _TCHAR* argv[])
  21. {
  22. const int n = 5;
  23. sport arr[n];
  24. int z = sportsmen(arr);
  25. }
  26. int sportsmen(sport* arr)
  27. {
  28. char name_in[20], name_out[20];
  29. int ball,numb,vid;
  30. scanf("%s %s", &name_in, &name_out);
  31. FILE*in;
  32. in = fopen(name_in, "rt");
  33. if (in == 0)
  34. {
  35. printf("Error!");
  36. return 1;
  37. }
  38. fscanf(in,"%d %d", &numb, &vid);
  39. for (int k = 0; k < numb; k++)
  40. {
  41. fscanf(in,"%s %s", &arr[k].sname, &arr[k].name);
  42. for (int i = 0; i < vid; i++)
  43. {
  44. fscanf(in,"%d", &ball);
  45. arr[k].sum += ball;
  46. }
  47. }
  48. fclose(in);
  49. sort(arr, numb);
  50. vyvod_bin(arr, name_out, numb);
  51. return 0;
  52. }
  53. void swap(char* n, char* k)
  54. {
  55. char tmp[20];
  56. strcpy(tmp, n);
  57. strcpy(n, k);
  58. strcpy(k, tmp);
  59. }
  60. void swap2(int& n, int& k)
  61. {
  62. int tmp = n;
  63. n = k;
  64. k = tmp;
  65. }
  66. void sort(sport* arr, int numb)
  67. {
  68. for (int i = 0; i < numb; i++)
  69. for (int j = 0; j < numb - 1; j++)
  70. if (arr[j].sum<arr[j + 1].sum)
  71. {
  72. swap(arr[j].sname, arr[j + 1].sname);
  73. swap(arr[j].name, arr[j + 1].name);
  74. swap2(arr[j].sum, arr[j + 1].sum);
  75. }
  76. }
  77. void vyvod_bin(sport* arr, char*name_out,int numb)
  78. {
  79. FILE* out;
  80. out = fopen(name_out, "w+b");
  81. char name1[20], sname1[20];
  82. int pos;
  83. for (int i = 0; i < numb; i++)
  84. {
  85. fwrite(&arr[i].sname, sizeof(struct sport), 1, out);
  86. fwrite(&arr[i].name, sizeof(struct sport), 1, out);
  87. fwrite(&arr[i].sum, sizeof(struct sport), 1, out);
  88. }
  89. for (int i = 0; i < numb; i++)
  90. {
  91. fread(&name1, sizeof(struct sport), 1, out);
  92. fread(&sname1, sizeof(struct sport), 1, out);
  93. printf("%s %s %d\n", name1, sname1, i + 1);
  94. }
  95. fclose(out);
  96. }
написала весь код программы, чтобы было легче ориентироваться. Не работает последний кусок
Листинг программы
  1. for (int i = 0; i < numb; i++)
  2. {
  3. fread(&name1, sizeof(struct sport), 1, out);
  4. fread(&sname1, sizeof(struct sport), 1, out);
  5. printf("%s %s %d\n", name1, sname1, i + 1);
  6. }
fwrite вроде бы всё корректно записывает(на консоль данные выводились правильные). Не могу считать. Visual Studio 2013 просто вылетает на этом куске кода. Остальное всё правильно.
5 3 1vanya vanyafam 5 5 5 2petya petyafam 0 0 0 3grisha grishafam 3 3 3 4katya katyafam 1 1 1 5vova vovafam 4 4 4 Это лежит во входном файле. (На всякий случай для тестирования). Должно получиться 1vanya vanyafam 1 5vova vovafam 2 3grisha grishafam 3 4katya katyafam 4 2petya petyafam 5

Решение задачи: «В двоичный файл записать Фамилию, Имя, Занимаемое место, упорядоченные по убыванию и вывести этот файл на экран»

textual
Листинг программы
  1.     for (int i = 0; i < numb; i++)
  2.     {
  3.         fwrite(&arr[i].sname, sizeof(struct sport), 1, out);
  4.         fwrite(&arr[i].name, sizeof(struct sport), 1, out);
  5.         fwrite(&arr[i].sum, sizeof(struct sport), 1, out);
  6.     }

Объяснение кода листинга программы

В данном коде используется оператор for для прохода по массиву структур arr определённое количество раз, указанное в переменной numb. В каждой итерации цикла выполняются следующие действия:

  1. fwrite(&arr[i].sname, sizeof(struct sport), 1, out) — информация из поля sname структуры arr[i] записывается в файл out, указанный в функции fwrite. Параметр sizeof(struct sport) указывает размер структуры sport, а параметр 1 указывает, что нужно записать 1 элемент.
  2. fwrite(&arr[i].name, sizeof(struct sport), 1, out) — информация из поля name структуры arr[i] записывается в файл out, указанный в функции fwrite. Параметр sizeof(struct sport) указывает размер структуры sport, а параметр 1 указывает, что нужно записать 1 элемент.
  3. fwrite(&arr[i].sum, sizeof(struct sport), 1, out) — информация из поля sum структуры arr[i] записывается в файл out, указанный в функции fwrite. Параметр sizeof(struct sport) указывает размер структуры sport, а параметр 1 указывает, что нужно записать 1 элемент. После выполнения всех итераций цикла, файл out будет содержать информацию о фамилии, имени и занимаемом месте, упорядоченных по убыванию.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.9 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы