1

次のようなdata.txtファイルを読み取り、buffer [i] [j]という配列に保存したい

1 1 1 1

2 2 2 2

3 3 3 3

4 4 4 4

次のようなコードを書いています

#include"stdio.h"
#include"stdlib.h"

int main() {

  FILE *fp1;
  int i,j;

  int buffer[4][4]={0};

  fp1 = fopen("exact_enumerated_config_442_cub_mc","r");

  for(i=0;i<4;i++) {
    for(j=0;j<4;j++) {
      fscanf(fp1,"%d", &buffer[i][j]);
    }
    // fscanf(fp1,"\n");
  }
  fclose(fp1);

  for(i=0;i<4;i++) {
    for(j=0;j<4;j++) {
      printf("%d ",buffer[i][j]);
    }
    printf("\n");
  }
}

しかし、私は出力を取得します...

1 1 2 1

5 1 6 1

17 1 18 1

21 1 22 1

どうして????

4

4 に答える 4

4
  • の結果を常にチェックしてfopen()、ファイルが開かれたことを確認してください。
  • の結果を常にチェックして、fscanf()成功したことを確認し、値が割り当てられていない可能性のある後続のコード処理変数を防止します (割り当てられた数を返します)。
  • 先頭のスペース文字をフォーマット指定子に追加して、改行文字を含む空白をスキップします: " %d".

このコードは、16 個の s を持つ 1 行を、4 個の sintを持つ 4 行と同じように扱いintます。ファイルのフォーマットがint1 行あたり 4 であることが重要な場合は、 を使用して 1 行を読み取り、fgets()を使用してフォーマット指定子で ssscanf()を抽出し、完全なバッファーが処理されたことを確認します。int%n

int ints[4][4] = { { 0 } };
char buffer[1024];
for (int i = 0; i < 4 && fgets(buffer, 1024, fp); i++)
{
    int pos;
    if (sscanf(buffer,
               "%d %d %d %d%n",
               &ints[i][0],
               &ints[i][1],
               &ints[i][2],
               &ints[i][3],
               &pos) != 4 || pos != strlen(buffer) - 1)
    {
        fprintf(stderr, "Invalid format: <%s>\n", buffer);
        exit(1);
    }
}
于 2013-04-25T14:08:38.957 に答える
1

必要な出力 (1111、2222、...) を取得するには、次のように変更します。

fp1 = fopen("exact_enumerated_config_442_cub_mc","r");

に:

fp1 = fopen("data.txt","r");

明確化:使用するときfopenは、読みたいファイルの名前を書く必要があります。あなたの場合、書く必要はありdata.txtませんexact_enumerated_config_442_cub_mc...この名前のファイルはありません。さらに、1 1 1 1、2 2 2 2、3 3 3 3、4 4 4 4 ...のようなデータはありません...

詳細については、次を参照してください:
wikibooks.org/wiki/C_Programming/C_Reference/stdio.h/fopen


これは、必要な出力を提供する「変更された」(余分/無駄/余分なものが{ }削除されてdata.txt書き込まれた) コードです: 1 1 1 1、2 2 2 2、3 3 3 3、4 4 4 4. という名前の配列を出力しbufferます。だということだ...

...データが正常にコピーされました! から : "data.txt" _ buffer[4][4]

#include"stdio.h"
#include"stdlib.h"

int main()
{
    FILE *fp1;
    int i,j;

    int buffer[4][4];

    for ( i = 0; i < 4; i++ )
        for ( j = 0; j < 4; j++ )
            buffer[i][j] = 0;


    fp1 = fopen("data.txt","r");

    for(i=0; i<4; i++)
        for(j=0; j<4; j++)
            fscanf(fp1,"%d", &buffer[i][j]);

    fclose(fp1);


    for(i=0; i<4; i++)
    {
        for(j=0; j<4; j++)
            printf("%d ",buffer[i][j]);
        printf("\n");
    }

return 0;
}

PS

data.txt含まない場合

1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4

しかし

1 1 1    1
2   2   2 2
3       3 3 3
4 444    // the last two elements are absent

プログラムは 1 行目、2 行目、3 行目を適切に読み取り、4 行目の出力は次のようになります。

4 444 0 0 

4、 then 、and 444then : 最後の 2 つの要素は '0' です。これは、ゼロで初期化されたため、すべての要素の値が変更されましたが、最後の 2 つはゼロのままです。00buffer

于 2013-04-25T14:07:13.520 に答える
1

" %d"改行の問題を回避するために、文字列形式の先頭にスペースを追加する必要があります

fscanf(fp1," %d", &buffer[i][j]);

ところで、代わりに次のコードを使用できます

for(i=0;i<4;i++) {
   fscanf(fp1," %d %d %d %d", &buffer[i][0], &buffer[i][1], &buffer[i][2], &buffer[i][3]);
}
于 2013-04-25T14:07:38.140 に答える