0

C で fscanf を使用すると問題が発生します。ファイルにランダム マトリックスを書き込んで、テキスト ファイルのデータを別のマトリックスに読み込もうとしています。行数と列数は問題ないように見えますが、データ値にはゼロが返されます。私は完全に立ち往生しているので、助けていただければ幸いです!

私のMATRIX構造は次のように宣言されています

typedef struct matrep {
      unsigned rows, columns;
      double *data;
      }MATRIX;

私のファイルは次のようになります。

rows = 5, columns = 10

  -99.75  12.72  -61.34  61.75  17.00  -4.03  -29.94  79.19  64.57  49.32
  -65.18  71.79  42.10   2.71  -39.20  -97.00  -81.72  -27.11  -70.54  -66.82
  97.71  -10.86  -76.18  -99.07  -98.22  -24.42   6.33  14.24  20.35  21.43
  -66.75  32.61  -9.84  -29.58  -88.59  21.54  56.66  60.52   3.98  -39.61
  75.19  45.34  91.18  85.14   7.87  -71.53  -7.58  -52.93  72.45  -58.08

そして、これは私のmatrix_read機能です:

MATRIX matrix_read(char file_name[15])
{
int i,j, m, n;
MATRIX B;
FILE *filep;
double *ptr = NULL;
double x;

if((filep = fopen("matrixA.txt", "r"))==NULL)
{
printf("\nFailed to open File.\n");
        }
if(fscanf(filep, "\n\nrows = %u, columns = %u\n\n", &m, &n) != 2)
{
    printf( "Failed to read dimensions\n");
    B.data = 0;
    B.columns = 0;
    B.rows = 0;
}
B.data = (double *)malloc(B.columns*B.rows*sizeof(double));
if(B.data ==0)
   {
    printf("Failed to allocate memory");
    }

fscanf(filep,"\n\nrows = %u, columns = %u\n\n",&m,&n);
rewind(filep);

ptr = B.data;

for (i = 0; i < m; i++)
{
    for (j = 0; j < n; j++)
    {

        if (fscanf(filep, "  %5.2lf", &x) != 1)
       {
           printf("Failed to read element [ %d,%d ]\n", i, j);
           B.data = 0;
           B.columns = 0;
           B.rows = 0;
        }
        printf("%5.2lf\t", x);
        *ptr++ = x; 
        }
      }

 B.rows=m;
 B.columns=n;
 return B;
 fclose(filep);
 free(ptr);
 }

ありがとう!

4

2 に答える 2

1

いくつかの問題があります。そのうちの1つは@simoncによって指摘され、もう1つは考えられる問題です。filepの列と行を読み取った後に巻き戻します。

rewind()ストリームに関連付けられた位置インジケーターをファイルの先頭に設定します。もう一度読んでください。rows = 5, columns = 10

ついに:

B.data = (double *)malloc(B.columns*B.rows*sizeof(double)); /* Don't cast malloc */
if(B.data ==0)
{
  printf("Failed to allocate memory");
  /* You have to return or exit here */
}
于 2013-01-09T14:35:39.303 に答える
0

Alter Mannが示したように、2 番目を削除します。

fscanf(filep,"\n\nrows = %u, columns = %u\n\n",&m,&n);

同様に

rewind(filep);

さらに、" %5.2lf"有効な scanf 変換仕様ではありません (これについてはマニュアルを参照してください) -"%lf"代わりに使用してください。

于 2014-05-12T11:34:55.920 に答える