#include <stdio.h>
#include <locale.h>
#include <stdlib.h>
#include <string.h>
#include <io.h>
#pragma warning(disable:4996)
struct sportsmen {
char full_name[60];
float results[6];
};
int main()
{
struct sportsmen *sportsmens;
sportsmens = (struct sportsmen*)malloc(sizeof(struct sportsmen));
setlocale(LC_ALL, "rus");
puts("Толкание ядра");
char extension[6] = { ".txt\0" };
char file_name[40];
puts("Введите название файла в пределах 30 символов (без указания расширения файла)");
gets(file_name);
strcat(file_name, extension);
printf("Имя файла: %s\n",file_name);
int what_do = 0; int size = 0;
FILE* table;
table = fopen(file_name, "rt");
if (table == NULL) {
puts("Не удалось открыть файл");
fclose(table);
exit(0);
}
while (!feof(table)) {
if (fgetc(table) == '\n')
size += 1;
}
fclose(table);
table = fopen(file_name, "rt");
sportsmens = (struct sportsmen*)malloc(size*sizeof(struct sportsmen));
for (int i = 0; i < size;i++) {
fscanf(table, "%s", &sportsmens[i].full_name);
fscanf(table, "%5.2f", &sportsmens[i].results[0]);
fscanf(table, "%5.2f", &sportsmens[i].results[1]);
fscanf(table, "%5.2f", &sportsmens[i].results[2]);
fscanf(table, "%5.2f", &sportsmens[i].results[3]);
fscanf(table, "%5.2f", &sportsmens[i].results[4]);
fscanf(table, "%5.2f", &sportsmens[i].results[5]);
}
;
fclose(table);
}
Спортсмен1 12,12 11,2 14,2 10,2 11,4 13,5
Спортсмен2 11,12 15,00 12,13 10,9 17,6 18,32
Спортсмен3 19,6 10,2 11,6 18,2 15,6 19,5
Спортсмен4 17,00 15,1 18,1 14,2 11,3 12,85
Спортсмен5 15,2 22,12 14,2 15,7 17,3 14,5
Спортсмен6 17,03 12,3 11,56 12,89 15,21 19,2
Спортсмен7 10,2 9,3 11,2 14,4 12,3 10,2
Спортсмен8 15,18 21,3 12,6 15,2 16,45 13,35
Спортсмен9 11,21 8,23 11,24 16,22 16,31 11,04
Спортсмен10 12,3 15,49 13,61 18,21 15,02 14,23
Почему-то как я не стараюсь всё записывается только в sportsmens[i].full_name,
fscanf
, а поля в твоём файле разделены пробелами, формат fscanf
должен включать в себя пробелы чтобы избавиться от разделителей. Кроме того, имеет смысл проверить, что setlocale
возвращает не-NULL, иначе он не повлияет на десятичный разделитель (и %f
не сможет прочитать число с плавающей точкой записанное как 12,12).