Запись данных в структуру из файла - 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); }
Объяснение кода листинга программы
- Объявлена переменная
s
типаchar
с длиной в 500 символов. - Затем, в цикле
for
, который начинается с 0 и продолжается до тех пор, пока функцияfgets()
успешно считывает строку из файлаfp
в переменнуюs
, выполняется следующая инструкция. - В этой инструкции используется функция
sscanf()
, которая считывает строку и извлекает из нее три значения:player_number
,first_name
иlast_name
. - Значения
player_number
,first_name
иlast_name
записываются в соответствующие поля структурыplayers[i]
. - Затем, с помощью функции
fprintf()
, в консоль выводится строка, содержащая значенияplayer_number
,first_name
иlast_name
из текущей записи. - После завершения цикла, программа продолжает работу с следующей записью в файле.
- Если в процессе чтения файла возникает ошибка (например, достигается конец файла или происходит ошибка чтения), цикл прекращается.
- Переменная
i
в циклеfor
используется как индекс для доступа к элементам массиваplayers
. - При каждой итерации цикла, следующий элемент массива
players
будет содержать следующую запись из файла. - Таким образом, весь файл считывается построчно, и каждая строка преобразуется в структуру
player
. - В конце каждой итерации цикла, структура
player
выводится в консоль с помощью функцииfprintf()
. - Значения
player_number
,first_name
иlast_name
выводятся в консоль без кавычек. - Если в процессе чтения файла возникают ошибки, программа выводит сообщение об ошибке и завершается.
- Если файл успешно прочитан до конца, программа завершается без ошибок.
- В конце программы, структура
players
и ее элементы будут содержать все считанные из файла данные. - Программа не проверяет, достаточно ли памяти выделено для массива
players
. Если в файле больше данных, чем доступная память, программа может завершиться с ошибкой. - Если в файле есть строки, которые не соответствуют ожидаемому формату (например, не содержат числового значения или имени), программа может завершить работу с ошибкой.
- Если в файле отсутствуют данные, программа может выводить сообщение об ошибке и завершаться.
- В консоли выводится информация о записях из файла в формате, указанном в начале кода.
- Код не содержит обработки ошибок и не проверяет, достаточно ли памяти для работы программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д