Запись данных в структуру из файла - 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. Если в файле больше данных, чем доступная память, программа может завершиться с ошибкой. - Если в файле есть строки, которые не соответствуют ожидаемому формату (например, не содержат числового значения или имени), программа может завершить работу с ошибкой.
- Если в файле отсутствуют данные, программа может выводить сообщение об ошибке и завершаться.
- В консоли выводится информация о записях из файла в формате, указанном в начале кода.
- Код не содержит обработки ошибок и не проверяет, достаточно ли памяти для работы программы.