2017-01-06 9 views
1

私はCで読んでいる一連の数字をファイルにして、配列に格納しています。リストの最後にポインタが読んで私の配列に送る新しい行がありますが、それは問題です。EOFの前にCファイルの読み込みを停止するには?

番号の一覧:

9 
8 
6 
5 
23 
42 

はコード:

FILE* fichier=NULL; 
fichier = fopen("resultat.txt","r"); 
int i=0; 
int ID[50]; 
while(fgetc(fichier)!=EOF && i<50){ 
    fscanf(fichier,"%d",&ID[i]); 
    printf("%d\n",ID[i]); 
    i++; 
} 
fclose(fichier); 

私はを持って出力:私はたい

42 
23 
9 
8 
5 
6 
5 
17081006 

出力:

42 
23 
9 
8 
5 
6 
5 

最後の(返却以外は空白)行の読み上げを停止するにはどうすればよいですか?

+0

2つの連続した '\ n'の後でループを中断する – joop

答えて

1

問題は、feof()の動作と使用方法に基づいています。ファイルの最後の読み出し動作が(まあ、あなたがfgetc()を使用しているが、動作はとにかく同じである)EOFマークや実際のデータを読んでいるかどうかを返すことによってfeof()作品

は、あなたの読み取りループは行いません。 EOFを要求する前にお読みください。代わりに、最初にEOFが見つかったかどうかを確認し、見つからない場合は、読み取り操作を実行して結果を印刷して元に戻します。最後の数値を読み取った後でも、fgetc()はまだEOFを返していないので、ループが再び入り、何も読まないので、printf()は何もわかりません。今度はあなたがEOFに達したときで、次に尋ねるときにfgetc()EOFを返します。

コードを次のように変更してみてください。私はfgetc()の代わりにfeof()を使用していますので、私はEOFに達したかどうか確認するために余分な読書をしません。

FILE* fichier=NULL; 
int i=0; 
int ID[50]; 
int num; /* temporary storage for number read from file */ 

fichier = fopen("resultat.txt","r"); 
fscanf(fichier,"%d",&num); /* first read, outside read loop */ 
while(!feof(fichier) && i<50) /* now you can ask for EOF */ 
{ 
    ID[i] = num;  /* if not EOF, store data read */ 
    printf("%d\n",ID[i]); /* and print it */ 
    fscanf(fichier,"%d",&num); /* then, read some more */ 
    i++; 
} 
fclose(fichier); 
4

fscanf()が1つのデータの読み取りに失敗した場合は、印刷を停止する必要があります。

fopen()の値は、機能を操作し未定義の動作を呼び出すファイルにNULLを渡す避けるためにチェックする必要があります戻ります。

FILE* fichier=NULL; 
fichier = fopen("resultat.txt","r"); 
int i=0; 
int ID[50]; 
if (fichier != NULL) { 
    while(i<50 && fscanf(fichier,"%d",&ID[i]) == 1){ 
     printf("%d\n",ID[i]); 
     i++; 
    } 
    fclose(fichier); 
} 
関連する問題