3

単純で愚かなことの解決策を探して最後の4時間を無駄にしたので、私は少し必死です。学校で、テキストファイルから整数を読み取り、それらの最大値を計算する必要があるプロジェクトがあります。重要なのは、これらの数字は必ずしもスペースで区切られている必要はなく、タブ(\ t)または改行(\ n)でも区切られているということです。fscanf関数を使用して整数を読み取りますが、問題は、最後の数値の後にファイルにスペースがあるため、最後の数値の2倍を読み取ることです(理由はわかりません)。通常は「そのスペースを削除するだけ」と言いますが、私の先生はいくつかの方法でプログラムをテストする予定であり、プログラムは堅牢である必要があると警告しました(スペースを管理できる必要があります、\ t、\ n数字を正しく読み取ることができるので、最後の数字の後に意図的にスペースを残したのはこのためです)。

FILE* file = NULL;
int *t = NULL, *new_size = NULL;
int temp, count;

file = fopen(argv[1],"r");
do
{
    fscanf(file,"%d",&temp);
    count++;

    new_size = (int*) realloc (t, count * sizeof(int));

    if (new_size != NULL)
    {
        t = new_size;
        t[count-1] = temp;
    }
    else
    {
        free(t);
        puts("Erreur d\'allocation memoire!\n");
        exit(1);
    }
} while(!feof(file));

fclose(file);

printf ("Numbers read\n:");
for(i = 0; i < count; i++)
{
    printf ("%d ", t[i]);
}

そして、私の引数はdata.txtという名前のファイルで、3 1 7 0 4 96150と最後に\nが含まれています。つまり、基本的に、私のプログラムは最初の8つの整数を読み取り、その後、EndOfFileではないため、最後の整数(150)を再度読み取ります。だから私の出力は次のとおりです。 3 1 7 0 4 9 6 150 150

プログラムをより堅牢にするために何をすべきか教えてもらえますか?最後にスペースがある場合、またはタブ(\t)がある場合は、同じタイプのOSエラーを管理する必要があります。どんな助けでもいただければ幸いです!

4

3 に答える 3

2

の戻り値を確認してくださいfscanf

if (fscanf(file,"%d",&temp) != 1) break;

番号が見つからなくなった場合は、ループから抜け出します。fscanf成功した変換の数を返します。これは、エラーのチェックと処理に使用する必要があります。

于 2012-11-12T22:24:48.727 に答える
2

fscanf()ループの終了条件として、行われた割り当ての数を返すの結果を使用します。ループの後で、EOFに到達し、他の障害が原因でループが終了しなかったことを確認します。

于 2012-11-12T22:24:59.990 に答える
0

数値がスペースで区切られている場合は、fscanfでスペースを読み取り、次に整数で読み取ることができます。プログラムを堅牢にするために、fscanfが失敗するかどうかを常に確認します。失敗する場合は、整数の読み取りを停止します。それ以外の場合は続行します。

bool good=true;
while(good)
{
    char separator;
    if(fscanf(file,"%c",&separator)==1)
    {
        if(separator!=' ' && separator!='\t' && separator!='\n')
        {
            fprintf(stderr,"Illegal character found in file");
            // You can choose if break the loop setting good to false, or
            // if to continue, this depends on your assignment
        }
        if(fscanf(file,"%d",&temp)==1)
        {
            < Push temp to your list/array >
        }
        else
        {
            good=false;
        }
    }
    else
    {
        good=false;
    }
}
于 2012-11-12T22:43:02.727 に答える