【问题标题】:fscanf not reading char from filefscanf 没有从文件中读取字符
【发布时间】:2017-06-25 17:29:41
【问题描述】:

我有一个程序可以从文件中读取并将汇编代码转换为 VM 机器代码。指令根据操作码有不同的数据类型,所以我的阅读器看起来像这样:

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。我查看了似乎对其他人有用的解决方案,但由于某种原因,它们似乎在这里不起作用。

【问题讨论】:

  • fscanf(inF," %c %d", &amp;r1, &amp;immediate); --> fscanf(inF," %i %d", &amp;r1, &amp;immediate); 假设 r1 是 int
  • r1的类型是什么?
  • 关于为什么while(!feof(inF)) 错误的旁注:stackoverflow.com/questions/5431941/…
  • r1的类型是char
  • 那么你会为文件循环推荐什么?

标签: c file-io scanf


【解决方案1】:

您已将变量immediate 声明为unsigned short 而行

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

假设它是一个整数。在这种情况下,行为是未定义的。

【讨论】:

  • 我将尝试更改类型并在获取值后添加转换为unsigned short
  • 好的,这得到了想要的结果,但是由于某种原因返回正确的值后,它继续给我与上面相同的结果。
  • 好吧,没关系,我通过在 if 语句末尾添加 return; 解决了这个问题。
猜你喜欢
  • 2014-02-10
  • 1970-01-01
  • 2017-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 2012-07-17
  • 1970-01-01
相关资源
最近更新 更多