Измените это:
fscanf(ifp," %d %0.1f %d %d", &arr[i].pid, &arr[i].AT, &arr[i].duration, &arr[i].rank);
на это:
fscanf(ifp," %d %f %d %d", &arr[i].pid, &arr[i].AT, &arr[i].duration, &arr[i].rank);
, поскольку вы использовали неверный спецификатор преобразования.
Обратите внимание на предупреждения компилятора в следующий разобычно они рассказывают всю историю:
warning: invalid conversion specifier '.'
[-Wformat-invalid-specifier]
fscanf(ifp," %d %0.1f %d %d", &arr[i].pid, &arr[i].AT, &arr[i].d...
~~~^
warning: format specifies type 'int *' but the argument has type
'float *' [-Wformat]
fscanf(ifp," %d %0.1f %d %d", &arr[i].pid, &arr[i].AT, &arr[i].d...
~~ ^~~~~~~~~~
%f
warning: data argument not used by format string
[-Wformat-extra-args]
..." %d %0.1f %d %d", &arr[i].pid, &arr[i].AT, &arr[i].duration, &arr[i].ra...
~~~~~~~~~~~~~~~~~ ^
Предупреждения предполагают, что из-за неверного спецификатора преобразования спецификатор формата %d
используется для поля с плавающей точкой вашей структуры (с именем AT
),и тогда все становится беспорядочным, так как вам не хватает одного спецификатора формата ...
Подробнее в Как принять только определенную точность (столько знаков после запятой) в scanf?