2

10行までのtxtファイルを読みたい。ファイルはすべての行で次のようにフォーマットされています。

1 1 8
2 2 3
3 1 15
4 2 7

渡された int によって提供される行のみから読み取る関数を作成しようとしています。forループを使用して、何もスキャンせずに行を反復処理することを考えましたが、それを実装する方法がわかりません。

これまでの私の関数は次のようになります。for ループはまだ適切に実装されていません。

void process(int lineNum, char *fullName)
  {
    int ii, num1, num2, num3;

    FILE* f; 
    f = fopen(fullName, "r");

    if(f==NULL) 
      {
      printf("Error: could not open %S", fullName);
      }

    else
    {
    for (ii=0 (ii = 0; ii < (lineNum-1); ii++)
      {
      /*move through lines without scanning*/
      fscanf(f, "%d %d %d", &num1, &num2, &num3);
      }

    printf("Numbers are: %d %d %d \n",num1, num2, num3);
    }
  }
4

3 に答える 3

2

ほとんど完了しましたが、フォーマット指定子を変更する必要があるだけです。次のコードは、意図した行の前の行を読み取りますが、読み取ったものは無視します。

for (ii=0 (ii = 1; ii < (lineNum-1); ii++)
      {
      /*move through lines without scanning*/
      fscanf(f, "%*d %*d %*d%*c");
      // fscanf(f, "%*d %*d %*d\n");
      }
fscanf(f,"%d%d%d",&num1,&num2,&num3);
于 2013-05-15T04:40:34.670 に答える
1

必要な行まですべての行を読む必要があります。

おそらくfgets()、行を読み、sscanf()必要な行を解析するために使用します。ただし、ループを追加して不要な行を読み取り (まだfgets()) 、必要な行を で読み取ることができますfscanf()。3 つの値を取得したことを確認してください。 からの戻り値を確認する必要がありますfscanf()。また、開いたファイルを閉じることを忘れないでください。

void process(int lineNum, char *fullName)
{
    FILE *f = fopen(fullName, "r");

    if (f == NULL) 
    {
        fprintf(stderr, "Error: could not open %S", fullName);
        return;
    }

    int num1, num2, num3;
    for (int i = 0; i < lineNum; i++)
    {
        if (fscanf(f, "%d %d %d", &num1, &num2, &num3) != 3)
        {
            fprintf(stderr, "Format error on line %d\n", i+1);
            fclose(f);
            return;
        }
    }

    printf("Numbers are: %d %d %d \n",num1, num2, num3);
    fclose(f);
}

このコードは、数値のセットを区切る行を実際には強制しないことに注意してください (関数ファミリーのファイルベースのメンバーの欠点の 1 つです。そのためには、とscanf()が必要です:fgets()sscanf()

void process(int lineNum, char *fullName)
{
    FILE *f = fopen(fullName, "r");

    if (f == NULL) 
    {
        fprintf(stderr, "Error: could not open %S", fullName);
        return;
    }

    char line[4096];
    for (i = 0; i < lineNum; i++)
    {
        if (fgets(line, sizeof(line), f) == 0)
        {
            fprintf(stderr, "Premature EOF at line %d\n", i+1);
            fclose(f);
            return;
        }
        // Optionally check format here...
    }

    int num1, num2, num3;
    if (sscanf(line, "%d %d %d", &num1, &num2, &num3) != 3)
    {
        fprintf(stderr, "Format error on line %d\n", i+1);
        fclose(f);
        return;
    }

    printf("Numbers are: %d %d %d \n",num1, num2, num3);
    fclose(f);
}
于 2013-05-15T04:35:45.047 に答える