Почему мои переменные не сохраняются?Я тестировал этот код, и мои переменные не сохраняются в моем массиве struct - PullRequest
0 голосов
/ 02 декабря 2018

Вот мой код и вывод моих переменных: Что еще мне нужно добавить в цикл while, чтобы мои переменные и методы работали.

int main() {
  FILE *ifp;
  ifp = fopen("processes.txt","r");
  if(ifp == NULL) {
      printf("Error Opening file.\n");
      exit(1);
  }

  char str[100];
  int i=0;

  while(fgets(str, 100, ifp) != NULL) {
    fscanf(ifp," %d %0.1f %d %d", &arr[i].pid, &arr[i].AT, &arr[i].duration, &arr[i].rank);
    i++;
  }
}
printf("ProceId AT   duration rank\n");

for (int j = 0; j < i - 1; ++j){
    printf("%d\t%0.1f\t%d\t%d\n",arr[j].pid,arr[j].AT,arr[j].duration,arr[j].rank );
}


ProceId AT   duration rank
1398    0.0     0       0
2306    0.0     0       0
3219    0.0     0       0
4478    0.0     0       0
5653    0.0     0       0
6399    0.0     0       0
7777    0.0     0       0

Вот файл сстрока строк, которая мне не нужна, поэтому я использовал fgets.

ProcessID   ArrTime Duration  Rank

1398        1.0     16      3
2306        4.5     6       7
3219        3.0     11      1
4478        2.0     3       5
5653        3.5     7       2
6399        4.0     8       6
7777        2.5     17      8   

1 Ответ

0 голосов
/ 02 декабря 2018

Измените это:

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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...