@Mishele123

Почему не работает функция fscanf?

Код считывает массив структур из файла. Но в функции main, почему то выводит мусор. Как это можно исправить? (В файле данные расположены так: "Солнечный,Самара,Москва,пеший,4,29"):
#include <stdio.h>
#include <stdlib.h>
#include <locale>
#include <conio.h>


struct Routes
{
	char title[32];
	char start[32];
	char finish[32];
	char type[32];
	int complexity;
	int duration;
}; // 6 записей

int size = 0;
Routes* arr = (Routes*)malloc(size * sizeof(Routes));

// Загрузить данные из файла
void get_datas(Routes *arr, int* size)
{
	FILE* file;
	file = fopen("datas.txt", "r");
	if (file == NULL) { printf("Ошибка открытия файла"); return; }
	int count = *size;
	int record = *size;
	int read; // Кол-во записей
	do
	{
		count++;
		arr = (Routes*)realloc(arr, count * sizeof(Routes));

		read = fscanf(file, "%32[^,],%32[^,],%32[^,],%32[^,],%d,%d\n",
			arr[record].title,
			arr[record].start,
			arr[record].finish,
			arr[record].type,
			&arr[record].complexity,
			&arr[record].duration
			);

		if (read == 6) record++;
		if (read != 6 && !feof(file)) return; // Неправильный формат файла
		if (ferror(file)) return; // Если произойдет ошибка
	} while (!feof(file));
	fclose(file);
	*size = count;
}

int main()
{
	setlocale(LC_ALL, "ru");
	printf("%d\n", size);
	get_datas(arr, &size);

	printf("%d\n", size);

	for (int i = 0; i < size; i++)
	{
		printf("%s %s %s %s %d %d", arr[i].title,
			arr[i].start,
			arr[i].finish,
			arr[i].type,
			arr[i].complexity,
			arr[i].duration);
	}

	free(arr);
}
  • Вопрос задан
  • 186 просмотров
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
в функции main, почему то выводит мусор

Значит дочитывает файл до конца и без ошибок конверсии. Такой формат: %32[^,] может записать до 33 байт (32 символа из файла + 0), что не влезет в такое поле: char title[32];. Если файл в кодировке utf-8, то байтов в полях может быть больше чем символов.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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