MPI fscanf()返回false值

时间:2012-11-04 08:48:28

标签: file mpi scanf

我的名为“a.txt”的文件包含一个数字(47)。

如果我使用fscanf(a,"%f",&num)在没有MPI的编译器上运行程序,它会给出一个真值nnum = 47

如果我使用MPI ssh运行程序,它不会返回正确的值。 它会返回num = 1104187136

为什么会这样?

int main(int argc, char *argv[]){
  int count;
  FILE *a1;
  float a;
  int num;

  a1 = fopen("a1.txt","r");


  MPI_Init(&argc, &argv);
  MPI_Comm_size(MPI_COMM_WORLD,&numOfProc);
  MPI_Comm_rank(MPI_COMM_WORLD,&my_rank);

  if(my_rank == 0){     
    fscanf(a1,"%f",&num);
    a = num;
    printf("a = %d",a);
  }

  MPI_Finalize();
}

1 个答案:

答案 0 :(得分:3)

我认为这里的问题不是MPI,甚至是fscanf;问题是使用fscanf。如果在编译时出现警告,则会收到有关格式代码的若干警告。

首先,你有:

int num;
fscanf(a1,"%f",&num);

尝试将数字作为浮点数读入,然后给它一个指向int的指针来存储它。 printf / scanf格式代码有点搞笑;它们不仅向fscanf指示如何解析输入,还指示保存结果的表示形式。如果您尝试将47.0的浮点表示复制到int变量中,您将得到:

int num;
float a;

a = 47.0;
*(float *)&num = a;

printf("num = %d\n", num);
...

num = 1111228416 

printf出现同样的问题:

a = num;
printf("a = %d",a);

这里你将num的值分配给a,这很好,编译器会在那里插入类型转换,但是你将该值解释为int并将其打印出来,这样你就得到了另一个表示/值那里不匹配。

所以我认为在你的代码中你想要

fscanf(a1,"%f",&a);
printf("a = %f",a);

fscanf(a1,"%d",&num);
printf("num = %d",num);

但不是你拥有它们的转换方式。