0

我正在尝试编写一个从文件中读取的小程序。我从包含以下数字的文件(random.dat)中尝试了这些代码:

0.575 0.235
0.456 0.322

我写的代码如下:

#include <stdio.h>
#include <stdlib.h>
#define N 2

int main (void) {
  FILE *fp;
  int i, j;
  double x,y,data[N][N] = {{0}};

  if ((fp = fopen("random.dat", "r")) == NULL ) {
    printf("Error\n");
    exit(EXIT_FAILURE);
  }

  fp = fopen("random.dat","r");
  printf("\n");

  for (i=0;i<N;i++){
    fscanf(fp,"%lf",&x);
    for(j=0;j<N;j++){
      fscanf(fp,"%lf",&x); 
      data[i][j] = x;
      printf("data[%d][%d]=%lf\n",i,j,data[i][j]);  
    }   
  }
  printf("\n");
  fclose(fp);
return(0);
}

代码写得好吗?

我不明白为什么终端会写:

data[0][0]=0.235000
data[0][1]=0.465000
data[1][0]=0.322000
data[1][1]=0.322000

代替:

data[0][0]=0.575000
data[0][1]=0.235000
data[1][0]=0.465000
data[1][1]=0.322000

任何想法?谢谢!

4

2 回答 2

1

在这个嵌套循环中(重新格式化以便于阅读):

for (i=0; i<N; i++)
{
    fscanf(fp, "%lf", &x);   // first fscanf

    for(j=0; j<N; j++)
    {
        fscanf(fp, "%lf", &x); // second fscanf
        data[i][j] = x;
        printf("data[%d][%d]=%lf\n", i, j, data[i][j]);  
    }    
}

您会看到内部循环立即覆盖了x在外部循环中读取的值。这意味着您基本上完全跳过读取文件中的第一个数字。稍后这会导致内部循环fscanf调用之一失败,但由于您不检查返回值,因此您的程序不会注意到。

只需删除第一fscanf()行即可。

作为编辑,如果您使用调试器单步执行您的程序,您会立即看到此问题发生。

于 2012-12-21T18:27:12.787 回答
0

替换语句,

for (i=0;i<N;i++){
   fscanf(fp,"%lf",&x);
   for(j=0;j<N;j++){
     fscanf(fp,"%lf",&x); 
     data[i][j] = x;
     printf("data[%d][%d]=%lf\n",i,j,data[i][j]);  
   }   
}

 for (i=0;i<N;i++){
    for(j=0;j<N;j++){
        fscanf(fp,"%lf",&x);
        data[i][j] = x;
        printf("data[%d][%d]=%lf\n",i,j,data[i][j]);
     }
 }
于 2012-12-21T18:38:52.617 回答