Запись данных в структуру из файла - C (СИ)

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

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

Пытаюсь прочесть файл и записать содержимое в структуру.
#include <stdio.h>
#include <stdlib.h>
#define NUMBER_OF_GAMES 10
#define MAX_NAME 20
 
struct name
{
    char first_name[MAX_NAME];
    char last_name[MAX_NAME];
};
struct player
{   
    short player_number;
    struct name fellow;
    int scores[NUMBER_OF_GAMES][4];
    double middle_score;
};
int main(int argc, char **argv)
{
    struct player players[5];
    if(argc == 1)
    {
        fprintf(stderr,"Не указано имя файла\n");
        exit(EXIT_FAILURE);
    }
    FILE * fp;
    if((fp = fopen(argv[1],"r")) == NULL)
    {
        fprintf(stderr,"Указанный файл не найден\n");
        exit(EXIT_FAILURE); 
    }
    int i;
    for(i = 0; i < NUMBER_OF_GAMES && fread(&players[5],sizeof(players)/sizeof(players[0]),1,fp) == 1; ++i)
    {
        fprintf(stdout,"\nСтруктура данных получает следующие данные\n");
        fprintf(stdout,"%hi %s %s %d %f\n",players[i].player_number, players[i].fellow.first_name,players[i].fellow.last_name, 
        players[i].scores[i][0], players[i].middle_score);
    }
return 0;
}
данные следующие:
1 Albert Einstein 0 1 2 3 4 1.2
Вот, что выдает командная строка:
Структура данных получает следующие данные 30132 �A� 0 0.000000 Структура данных получает следующие данные 0 0 0.000000 Структура данных получает следующие данные 1 0 0.000000 Структура данных получает следующие данные 20014 =� 32765 0.000000 Структура данных получает следующие данные -7736 �A� 32706 0.000000 Структура данных получает следующие данные 13344 1. 0 0.000000

Решение задачи: «Запись данных в структуру из файла»

textual
Листинг программы
    char s[500];
    for(i=0; fgets(s,500,fp); i++)
    {
        sscanf(s,"%hi%s%s",&players[i].player_number, players[i].fellow.first_name,players[i].fellow.last_name);
        fprintf(stdout,"%hi %s %s\n",players[i].player_number, players[i].fellow.first_name,players[i].fellow.last_name);
    }

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

  1. Объявлена переменная s типа char с длиной в 500 символов.
  2. Затем, в цикле for, который начинается с 0 и продолжается до тех пор, пока функция fgets() успешно считывает строку из файла fp в переменную s, выполняется следующая инструкция.
  3. В этой инструкции используется функция sscanf(), которая считывает строку и извлекает из нее три значения: player_number, first_name и last_name.
  4. Значения player_number, first_name и last_name записываются в соответствующие поля структуры players[i].
  5. Затем, с помощью функции fprintf(), в консоль выводится строка, содержащая значения player_number, first_name и last_name из текущей записи.
  6. После завершения цикла, программа продолжает работу с следующей записью в файле.
  7. Если в процессе чтения файла возникает ошибка (например, достигается конец файла или происходит ошибка чтения), цикл прекращается.
  8. Переменная i в цикле for используется как индекс для доступа к элементам массива players.
  9. При каждой итерации цикла, следующий элемент массива players будет содержать следующую запись из файла.
  10. Таким образом, весь файл считывается построчно, и каждая строка преобразуется в структуру player.
  11. В конце каждой итерации цикла, структура player выводится в консоль с помощью функции fprintf().
  12. Значения player_number, first_name и last_name выводятся в консоль без кавычек.
  13. Если в процессе чтения файла возникают ошибки, программа выводит сообщение об ошибке и завершается.
  14. Если файл успешно прочитан до конца, программа завершается без ошибок.
  15. В конце программы, структура players и ее элементы будут содержать все считанные из файла данные.
  16. Программа не проверяет, достаточно ли памяти выделено для массива players. Если в файле больше данных, чем доступная память, программа может завершиться с ошибкой.
  17. Если в файле есть строки, которые не соответствуют ожидаемому формату (например, не содержат числового значения или имени), программа может завершить работу с ошибкой.
  18. Если в файле отсутствуют данные, программа может выводить сообщение об ошибке и завершаться.
  19. В консоли выводится информация о записях из файла в формате, указанном в начале кода.
  20. Код не содержит обработки ошибок и не проверяет, достаточно ли памяти для работы программы.

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


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

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

9   голосов , оценка 3.889 из 5