File MPI fscanf()返回假值

File MPI fscanf()返回假值,file,mpi,scanf,File,Mpi,Scanf,我的名为“a.txt”的文件包含一个数字(47) 如果我在没有MPI的编译器上使用fscanf(a,“%f”,&num)运行程序,它会给出一个真值nnum=47 如果我使用MPI ssh运行程序,它不会返回正确的值。 它将返回num=1104187136 为什么会这样 intmain(intargc,char*argv[]){ 整数计数; 文件*a1; 浮动a; int-num; a1=fopen(“a1.txt”,“r”); MPI_Init(&argc,&argv); MPI通信大小(MPI

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

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

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

为什么会这样

intmain(intargc,char*argv[]){
整数计数;
文件*a1;
浮动a;
int-num;
a1=fopen(“a1.txt”,“r”);
MPI_Init(&argc,&argv);
MPI通信大小(MPI通信世界和numOfProc);
MPI通信等级(MPI通信世界和我的通信等级);
如果(my_rank==0){
fscanf(a1、%f、&num);
a=num;
printf(“a=%d”,a);
}
MPI_Finalize();
}

我认为这里的问题不在于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并将其打印出来,因此您会在那里得到另一个表示/值不匹配

因此,我认为在您的代码中,您需要:


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

调用fopen后,我没有看到任何错误检查-您怎么知道文件是否已成功打开?您的文件不应该被称为a1吗?因为你叫A=fopen。。。
fscanf(a1,"%f",&a);
printf("a = %f",a);
fscanf(a1,"%d",&num);
printf("num = %d",num);