1

ファイルをループしてファイルの行数を確認した後、ファイル内のすべての情報を配列に入れようとしています。ファイルの行を配置するとうまくいくようですが、ファイルに戻って配列を印刷するときに配列の場所をファイルの行に設定すると、数値が本来あるべきものとは大きく異なります。

これが私のコードです。

int main()
{

                            //Opens File

    char fName[20];

   // fName = getchar();

    scanf( "%s", fName);

    FILE *fpIn;

    fpIn = fopen ( fName, "rt");
   // fpIn = fopen( "test1.txt", "rt");

    if ( fpIn == NULL)
    {
        printf( "Unable to open: ");
        exit(99);
    }

                            //Gets Lines

    int lines=0;
    char ch;

    while((ch=fgetc(fpIn))!=EOF)
    {
        if (ch=='\n') { lines++; }

    }

    clearerr(fName *fpIn);
    fclose(fpIn);
    fopen(fName, "rt");

                            //Makes Array

    int *pA;

    pA = (int *)malloc(lines*sizeof(int));

                            //Fills Array

    for (int i=0; i<lines; i++)
    {
        while ((ch=fgetc(fpIn))!='\n')
        {
            pA[i] = ch;
        }
        ch=fgetc(fpIn);
    }

    for (int i=0; i<lines; i++)
    {
        printf("%d\n", pA[i]);
    }



    return 0;
}
4

2 に答える 2

0

コードの次の部分を検討してください。

    while ((ch=fgetc(fpIn))!='\n')
    {
        pA[i] = ch;
    }

iこのループ中は変更されないため、pA[i]新しい文字ごとに上書きされ続けます。pA[i]行の最後の文字が含まれることになります。

于 2013-02-03T17:06:04.073 に答える
0

Vaughn Cato によって提案された getc() の代わりに fscanf() ステートメントに切り替えることは、正しい解決策に私を導くのに間違いなく役立ちました。実際の違いは、次の整数に進む前に、行の終わりに到達したことを確認する while ステートメントを削除したことです。

コードは次のようになります。

for (int i=0; i<lines; i++)
    {
        fscanf(fpIn, "%lf", &pA[i]);
    }

そして、これまでのところ、すべての適切なデータ入力ファイルで機能するようです。

于 2013-02-04T20:29:36.547 に答える