Почему так читается текстовый файл?

У меня есть структура, состоящая из массивов char и float. Почему-то как я не стараюсь всё записывается только в sportsmens[i].full_name, я не очень знаю Си, поэтому не могу понять с чем это связано, fgets() мне не подходит, мне необходимо вытаскивать значения для переменных
spoiler
#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);
}

Содержимое файла:
spoiler
Спортсмен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
  • Вопрос задан
  • 82 просмотра
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Почему-то как я не стараюсь всё записывается только в sportsmens[i].full_name,

Поскольку ты используешь fscanf, а поля в твоём файле разделены пробелами, формат fscanf должен включать в себя пробелы чтобы избавиться от разделителей. Кроме того, имеет смысл проверить, что setlocale возвращает не-NULL, иначе он не повлияет на десятичный разделитель (и %f не сможет прочитать число с плавающей точкой записанное как 12,12).
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы