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呼び出しの1つが失敗しますが、戻り値をチェックしないため、プログラムは気づきません。

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 に答える