file - MPI fscanf() 返回假值

标签 file mpi scanf

我的名为“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/

相关文章:

python - mpi4py | comm.bcast 不起作用

c++ - Boost MPI 的 Autoconf 宏?

c:将 const char* 读入 sscanf 中的变量?

c++ - 为什么scanf需要额外的参数?

file - 获取$ webclient.downloadstring以在Powershell中写入文本文件

c++ - VC++ 2010 : Error with Show open dialog after conversion from VC6++

php - 在哪里可以找到创建单向注册和登录系统的教程?

html - Qt:如何以纯文本格式打开 Html 文件?

c++ - MPI_Gather()、MPI_Scatter()中发送计数和接收计数有什么区别?

c - 为什么我的程序将相同的语句打印两次?