2017-03-29 12 views
2

ファイルから読み取ったもの:P1/s/e/tなど/は別の行です。特定の文字( 'a'のようなもの)の後に私が収集しなければならないデータが来るので、私はfgetsを使いたくありません。実行を終了しません。私を手伝ってくれますか?ファイルの終わりまでの読み方C、fscanf

char com[21]; 
fscanf(src,"%s",com); 
while(com!=EOF) 
{ 
    if(com[0]=='a') 
     fprintf(dest,"%s 1",com); 
    if(com[0]=='s') 
     fprintf(dest,"%s 2",com); 
    fscanf(src,"%s",com); 
} 
+1

あなたは 'fgets'を使用したくない理由、満足の理由を与えることはありません。 'scanf'ファミリーと連続して入力するよりも、入力データを文字列として調べるほうがはるかに簡単です。しかし、ファイルの終わりを確認できる方法の1つは、fscanf(src、 "%s"、com);という関数の戻り値をテストすることです。 –

答えて

2

簡単な方法は、fscanf()は、ループ条件として成功したかどうかをテストすることですし、ループの前にfscanf()を必要としません:

char com[21]; 

while(fscanf(src,"%20s",com) == 1) 
{ 
    if(com[0]=='a') 
     fprintf(dest,"%s 1",com); 
    if(com[0]=='s') 
     fprintf(dest,"%s 2",com); 
} 

fscanf()が正常にスキャンした項目の数を返します。したがって、返されたかどうか確認する必要はありませんEOF

バッファオーバーフローを避けるために、フォーマット文字列を変更しました。 fscanf()の代わりにfgets()を使用することをお勧めします(重要な場合は、改行文字を覚えておいてください)。

1

fscanfは、integerを返します。これは、ファイルの終わりに達するとEOFと表示されます。詳細については、マニュアルページを参照してください。

あなたのコードは以下のように変更する必要があります:

char com[21]; 
int ret; 
ret = fscanf(src,"%s",com); 
while(ret!=EOF) 
{ 
    if(com[0]=='a') 
     fprintf(dest,"%s 1",com); 
    if(com[0]=='s') 
     fprintf(dest,"%s 2",com); 
    ret = fscanf(src,"%s",com); 
} 
+0

すぐにお返事ありがとうございます。 –

関連する問題