我的名为“a.txt”的文件包含一个数字 (47
)。
如果我在没有 MPI 的编译器上使用 fscanf(a,"%f",&num)
运行该程序,它会给出一个真值 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();
}
最佳答案
我认为这里的问题不是 MPI,甚至不是 fscanf
;问题是 fscanf 的使用。如果您在打开警告的情况下进行编译,您将收到几个有关格式代码的警告。
首先,您有:
int num;
fscanf(a1,"%f",&num);
它尝试将数字作为 float 读入,然后给它一个指向 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);
但不是您所拥有的转化方式。
关于file - MPI fscanf() 返回假值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13217241/