在同一printf中使用许多fgetc时,结果反转

时间:2018-08-10 11:45:23

标签: printf fgetc

我有一个带有{ABCDEFGHI“的文件archivo3.txt,我通过fgetc分别读取了前三个字符(不同的printf)并且可以正常工作(显示了41、42、43) ,当我尝试执行相同操作但仅使用一个printf时就会出现问题。

在这种情况下,值从右到左显示(43,42,41)。有人知道会发生什么吗?

我的代码是:

#include<stdio.h>
#include<stdlib.h>

int main(){

  FILE*app_f=fopen("archivo3.txt", "rb");
  if(app_f==NULL){
    printf("error al abrir el archivo");
    exit(1);
  }else{
  fseek(app_f,0, SEEK_SET);
  printf("caracteres %02X\n", fgetc(app_f));
  printf("caracteres %02X\n", fgetc(app_f));
  printf("caracteres %02X\n", fgetc(app_f));
  printf("\n--------------\n");
  fseek(app_f,0, SEEK_SET);
  printf("caracter %02X, %02X, %02X\n", fgetc(app_f), fgetc(app_f), fgetc(app_f));
  }
  return 0;
}

1 个答案:

答案 0 :(得分:0)

参数的评估顺序未在任何标准中定义,因此编译器之间可能会有所不同。看来您的编译器正在从最后到第一计算表达式,而不是相反。另一个编译器可能会以不同的顺序进行操作。

因此,最安全的做法是不假定将评估printf参数的顺序,并相应地编写代码。请参阅下面的代码段。

有关更多信息,请参见this more thorough question

#include<stdio.h>
#include<stdlib.h>

int main(){
  chars = char[3];

  FILE*app_f=fopen("archivo3.txt", "rb");
  if(app_f==NULL){
    printf("error al abrir el archivo");
    exit(1);
  }else{
  fseek(app_f,0, SEEK_SET);
  chars[0] = fgetc(app_f);
  chars[1] = fgetc(app_f);
  chars[2] = fgetc(app_f);
  printf("caracteres %02X\n", chars[0]);
  printf("caracteres %02X\n", chars[1]);
  printf("caracteres %02X\n", chars[2]);
  printf("\n--------------\n");
  fseek(app_f,0, SEEK_SET);
  printf("caracter %02X, %02X, %02X\n", chars[0], chars[1], chars[2]);
  }
  return 0;
}