Изменение файла путем внесения информации из структуры - C (СИ)

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

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

Мне нужно прочесть каждую строку в файле, посчитать среднее значение очков, добавить в конец каждой строки следующее значение:
#include <stdio.h>
#include <stdlib.h>
#define NUMBER_OF_PLAYERS 100
#define MAX_NAME 20
#define MAX_STRING 500
#define SCORE_NUMBER 4
 
struct name
{
    char first_name[MAX_NAME];
    char last_name[MAX_NAME];
};
struct player
{   
    int player_number;
    struct name fellow;
    int scores[SCORE_NUMBER];
    double middle_score;
};
char get_first(void);
int main(int argc, char **argv)
{
    struct player players[NUMBER_OF_PLAYERS];
    if(argc == 1)
    {
        fprintf(stderr,"No argument\n");
        exit(EXIT_FAILURE);
    }
    FILE * fp;
    int nol = 0;
    long int position;
    char string[MAX_STRING];
    system("clear");
    if((fp = fopen(argv[1],"a+b")) == NULL)
    {
        fprintf(stderr,"File is not found\n");
        exit(EXIT_FAILURE); 
    }
    int i;
    char c;
    long int pos;
    //rewind(fp);
    for(i = 0;!feof(fp); ++i)
    {
        pos = ftell(fp);
        fgets(string,MAX_STRING,fp);
        sscanf(string,"%d%s%s%d%d%d%d",&players[i].player_number, players[i].fellow.first_name,
        players[i].fellow.last_name, &players[i].scores[0],&players[i].scores[1],&players[i].scores[2], 
        &players[i].scores[3]);
        players[i].middle_score = (players[i].scores[0]+players[i].scores[1]+players[i].scores[2]+
        players[i].scores[3])/(double)SCORE_NUMBER; 
        fwrite(players+i,1,sizeof(struct player),fp);
        fprintf(stdout,"Modified string:\n");
        fseek(fp,-pos,SEEK_SET);
        fgets(string,MAX_STRING,fp);
        fputs(string,stdout);
        fseek(fp,+pos,SEEK_SET);
        fprintf(stdout,"i = %d", i);
    }
return 0;
}
Цикл завершается ошибкой сегментации при счетчике 194 при том, что программа для чтения двоичных файлов читает только одну строку после изменений, внесенных этой программой, и несколько непонятных символов. Строка
fwrite(players+i,1,sizeof(struct player),fp);
не работает, новая колонка не перезаписывается, однако вывод данных производится верно, что для меня странно, так как я думал, что fwrite смещает указатель файла, соответственно, после
fseek(fp,-pos,SEEK_SET);
указатель по идее не должен указывать на начало измененной строки. Прошу помочь разобраться в проблема.

Решение задачи: «Изменение файла путем внесения информации из структуры»

textual
Листинг программы
double middle_count(int *mass, int size_of_mass)
{
    int i;
    double count;
    for(i = 0, count = 0; i < size_of_mass; ++i)
    {
        count+=mass[i];
        
    }
return count/(double)(i+1);
}

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

  1. В функции объявлены следующие переменные: — i (номер строки 3) — переменная для цикла for, используется для итерации по элементам массива mass; — count (номер строки 4) — переменная для хранения суммы элементов массива mass; — mass (номер строки 5) — указатель на массив, в котором хранятся данные; — size_of_mass (номер строки 6) — переменная, содержащая размер массива mass.
  2. Цикл for выполняется до тех пор, пока i меньше size_of_mass. На каждой итерации к переменной count прибавляется значение элемента массива mass, на который указывает i.
  3. После выполнения цикла переменная count содержит сумму всех элементов массива mass.
  4. В строке с номером 13 функция возвращает значение count, деленное на (i+1). Переменная i увеличивается на 1 на каждой итерации цикла, поэтому на последней итерации (i+1) будет равно size_of_mass+1. Таким образом, результатом выполнения функции будет отношение суммы элементов массива к его размеру.

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


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

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

8   голосов , оценка 4.125 из 5
Похожие ответы