2017-02-08 4 views
1

У меня есть программа, которая читает из файла и преобразует код сборки в машинный код VM. Инструкции имеют различные типы данных в зависимости от опкода, так что мой читатель выглядит следующим образом:fscanf not reading char из файла

while(!feof(inF)) { 
    fscanf(inF, "%s",&temp); //analyse first string and branch into if statement 
     printf("%s\n", temp); 
     if (strcmp(temp, "NOP") == 0 || strcmp(temp, "nop") == 0) { 
      fprintf(outF, "%i\n", 0); 
     } 
     else if (strcmp(temp, "LDI") == 0 || strcmp(temp, "ldi") == 0) { 
      opcode = LDI; //opcode 1 
      fscanf(inF," %c %d", &r1, &immediate); //get r1 and immediate 
      printf("R1: %i\n", r1); 
      printf("I: %i\n", immediate); 
      r1 = getReg(r1); 
      r2 = 0; 
      subop = 0; 
      output = (opcode << 27)|(r1 << 24)|(r2 << 21)|(subop << 16)|(immediate); 
      fprintf(outF, "%x\n", output); 
     }   
} 

С линией чтения LDI A 1024, я получаю выход:

LDI 
R1: 0 
I: 1024 

Вместо ожидаемого

LDI 
R1: 65 
I: 1024 

Похоже, что fscanf не читает char. Я смотрел на решения, которые, казалось, работали для других, и они почему-то не работают.

+0

'fscanf (inF,"% c% d ", & r1, & instant);' -> 'fscanf (inF,"% i% d ", & r1, & instant);' предполагается, что 'r1' является' int' – LPs

+3

Какой тип 'r1'? – Marian

+2

Замечание о том, почему 'while (! Feof (inF))' неверно: http://stackoverflow.com/questions/5431941/why-is-while-feof-file-always-wrong –

ответ

1

Вы объявили переменную immediate как unsigned short в то время как линия

fscanf(inF," %c %d", &r1, &immediate); 

допускает это целое число. В таких случаях поведение не определено.

+0

Я попробую изменить тип и добавить приведение к 'unsigned short' после получения значения –

+0

Итак, это дает желаемый результат, но затем он продолжается чтобы дать мне тот же результат, что и выше, после того, как по какой-то причине вернули правильные значения. –

+0

Хорошо, что я исправил эту проблему, добавив 'return;' в конце инструкции if. –

Смежные вопросы