2

コードの座標値を含むファイルを読み込もうとしています。scanf を使用するたびに、最初の行のみを読み取ります...(60,70,200,200)。私の質問は、コードにファイルのすべての内容を読み取らせ、画面に出力させる方法です。コードとファイルは次のとおりです。

 FILE.txt:
   S (60,70)(200,200)
   S (30,40)(100,200)
   S (10,20)(80,10)
   S (60,400)(700,200)
   S (160,70)(240,20)

 MY CODE:
 #include <stdio.h>
 int a;
 int b;
 int c;
 int d;
 int data[4][5];

int main ( int argc, char *argv[] )
 {

if ( argc != 2 ) /* argc should be 2 for correct execution */
{
    /* We print argv[0] assuming it is the program name */
    printf( "usage: %s filename", argv[0] );
}
else 
{
    // We assume argv[1] is a filename to open
    FILE *file = fopen( argv[1], "r" );

    /* fopen returns 0, the NULL pointer, on failure */
    if ( file == 0 )
    {
        printf( "Could not open file\n" );
    }
    else 
    {
       int i,j;
      for (j=0; j < 5; j++) 
       {
         for (i=0; i < 4; i++) {  
         fscanf(file, "S (%d,%d)(%d,%d)", &a, &b, &c, &d);
           data[i][j] = (a, b, c, d);              
           printf("%d,%d,%d,%d\n",a, b, c, d);
          }
      }             

        fclose( file );
    }
  }
}
4

6 に答える 6

1

などのI/O呼び出しの戻り値を確認する必要がありますfscanf()。失敗した場合は、変数を変更せずに0を返します。

また、これ:

data[i][j] = (a, b, c, d); 

Cではあまり意味がありません。CにはPythonのようなタプルがないことに注意してください。上記は次と同等です。

data[i][j] = d;
于 2012-09-21T09:05:13.527 に答える
0

以前fgetsはファイル行を 1 行ごとに読み取っていましたが、sscanf代わりに使用していましたfscanf

#include <stdio.h>
#include <string.h>

int data[4][5];
char line[128];

int main ( int argc, char *argv[] )
{

    if ( argc != 2 ) /* argc should be 2 for correct execution */
    {
        /* We print argv[0] assuming it is the program name */
        printf( "usage: %s filename", argv[0] );
    }
    else
    {
        // We assume argv[1] is a filename to open
        FILE *file = fopen( argv[1], "r" );

        /* fopen returns 0, the NULL pointer, on failure */
        if ( file == 0 )
        {
            printf( "Could not open file\n" );
        }
        else
        {
           int i=0;
           line[0] = 0;
           while(fgets(line,sizeof(line),file))
            {
               sscanf(line, "S (%d,%d)(%d,%d)", &data[i][0], &data[i][1], &data[i][2], &data[i][3]);
               printf("%d,%d,%d,%d\n", data[i][0], data[i][1], data[i][2], data[i][3]);
               i++;
            }
            fclose( file );
        }
      }
}
于 2012-09-21T10:31:17.337 に答える
0

使用whileループ:

const int NumberOfValuesIamGoingToReadAtOnce = 4;

while (fscanf(file, "S (%d,%d)(%d,%d)", &a, &b, &c, &d) == NumberOfValuesIamGoingToReadAtOnce)
{
    // do some actions with obtained values
}

fscanf 戻り値で読み取った値の数を返すので、EOFが達成されたか、ファイルが間違って書き込まれたかを判断できます

于 2012-09-21T09:08:35.517 に答える
0

改行も読んでみてください:

 fscanf(file, "S (%d,%d)(%d,%d)\n", &a, &b, &c, &d);

しかし、なぜ二重ループなのか: 既に 4 つの値を同時に読み取っています。代わりに、1 つの無限ループにして、4 つの値を読み取ったかどうかを確認します。4 つの値を読み取らなかった場合に中断します。

最後に:

   data[i][j] = (a, b, c, d);

意味がありません (適切なコンパイラ警告が表示されます)。代わりに、これは 2 番目のループが必要な場所かもしれません: scanf ステートメントではなく、代入の周りです。

于 2012-09-21T09:08:47.207 に答える
0

に行く場合はfscanf()、fscanf() での読み取り方法のように、ファイルが正確な数のスペースを含む正しい形式であることを確認する必要があるため、注意する必要があります。

fgets()を使用して文字列から数値を読み取ることをお勧めしsscanf()ます。

data[i][j] = (a, b, c, d);

この行は、あなたが思っていることをしません。行内のすべての数値を一度に読み取るため、別のループは必要ありません。

   for (j=0; j < 5; j++) 
       {
         fscanf(file, "S (%d,%d)(%d,%d)", &a, &b, &c, &d);
           data[j][0] = a;
           data[j][1] = b;
           data[j][2] = c;
           data[j][3] = d;

           printf("%d,%d,%d,%d\n",a, b, c, d);
          }
      }             

に変更data[4][5]data[5][4]ます。

于 2012-09-21T09:10:04.880 に答える
0
  1. data[4][5] を data[5][4] に宣言する
  2. for (i=0; i < 5; i++)
    { fscanf(file, "S (%d,%d)(%d,%d)", &a, &b, &c, &d);のループを変更します。

         data[i][0] =a;
         data[i][1] =b;
         data[i][2] =c;
         data[i][3] =d;
         printf("%d,%d,%d,%d\n",a, b, c, d);
      }
    
于 2012-09-21T09:14:59.880 に答える