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

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

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

// Sportsmens.cpp: определяет точку входа для консольного приложения.
//даны количество спортсменов, количество видов спорта и записи (с консоли или текстового файла)
//Фамилия Имя баллы(по каждому виду спорта)
//в двоичный файл записать Фамилию Имя Занимаемое место, упорядоченные по убыванию и вывести этот файл на
//экран
 
#include "stdafx.h"
#include <iostream>
#include <string.h>
struct sport
{
    char sname[20];
    char name[20];
    int sum=0;
};
void swap(char* n, char* k);
int sportsmen(sport* arr);
void swap2(int& n, int& k);
void sort(sport* arr, int numb);
void vyvod_bin(sport* arr, char*name_out, int numb);
 
int _tmain(int argc, _TCHAR* argv[])
{
    const int n = 5;
    sport arr[n];
    int z = sportsmen(arr);
}
 
int sportsmen(sport* arr)
{
    char name_in[20], name_out[20];
    int ball,numb,vid;
    scanf("%s %s", &name_in, &name_out);
    FILE*in;
    in = fopen(name_in, "rt");
    if (in == 0)
    {
        printf("Error!");
        return 1;
    }
    fscanf(in,"%d %d", &numb, &vid);
    for (int k = 0; k < numb; k++)
    {
        fscanf(in,"%s %s", &arr[k].sname, &arr[k].name);
        for (int i = 0; i < vid; i++)
        {
            fscanf(in,"%d", &ball);
            arr[k].sum += ball;
        }
    }
    fclose(in);
    sort(arr, numb);
    vyvod_bin(arr, name_out, numb);
    return 0;
 
}
 
void swap(char* n, char* k)
{
    char tmp[20];
    strcpy(tmp, n);
    strcpy(n, k);
    strcpy(k, tmp);
}
void swap2(int& n, int& k)
{
    int tmp = n;
    n = k;
    k = tmp;
}
void sort(sport* arr, int numb)
{
    for (int i = 0; i < numb; i++)
    for (int j = 0; j < numb - 1; j++)
    if (arr[j].sum<arr[j + 1].sum)
    {
        swap(arr[j].sname, arr[j + 1].sname);
        swap(arr[j].name, arr[j + 1].name);
        swap2(arr[j].sum, arr[j + 1].sum);
    }
}
void vyvod_bin(sport* arr, char*name_out,int numb)
{
    FILE* out;
    out = fopen(name_out, "w+b");
    char name1[20], sname1[20];
    int pos;
    for (int i = 0; i < numb; i++)
    {
        fwrite(&arr[i].sname, sizeof(struct sport), 1, out);
        fwrite(&arr[i].name, sizeof(struct sport), 1, out);
        fwrite(&arr[i].sum, sizeof(struct sport), 1, out);
    }
    for (int i = 0; i < numb; i++)
    {
        fread(&name1, sizeof(struct sport), 1, out);
        fread(&sname1, sizeof(struct sport), 1, out);
        printf("%s %s %d\n", name1, sname1, i + 1);
    }
    fclose(out);
}
написала весь код программы, чтобы было легче ориентироваться. Не работает последний кусок
for (int i = 0; i < numb; i++)
    {
        fread(&name1, sizeof(struct sport), 1, out);
        fread(&sname1, sizeof(struct sport), 1, out);
        printf("%s %s %d\n", name1, sname1, i + 1);
    }
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
Листинг программы
    for (int i = 0; i < numb; i++)
    {
        fwrite(&arr[i].sname, sizeof(struct sport), 1, out);
        fwrite(&arr[i].name, sizeof(struct sport), 1, out);
        fwrite(&arr[i].sum, sizeof(struct sport), 1, out);
    }

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

В данном коде используется оператор 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
Похожие ответы