2016-01-14 8 views
6
#include <stdio.h> 
#include <stdlib.h> 

#define FILE_NAME "ff.txt" 

int main() {   
    char x[10],y[10]; 
    FILE *fp; 
    fp = fopen(FILE_NAME, "r+"); 
    if (fp == NULL) { 
     printf("couldn't find %s\n ",FILE_NAME); 
     exit(EXIT_FAILURE);   

    } 
    fprintf(fp,"Hello2 World\n"); 
    fflush(fp); 
    fscanf(fp,"%s %s",x,y); 
    printf("%s %s",x,y); 
    fclose(fp); 
    return 0; 
} 

ここでは、私がやろうとしていることの煮詰めたバージョンです。このコードは、コンソールに何も印刷しません。私はfprintf呼び出しを削除した場合、それはそのHello2 World私のために、ファイルの最初の2つの文字列を出力します。なぜこうなった?私の後でさえ、fflushfpfscanfとfprintfを一緒に使ってCで

答えて

6

fprintf()の後、ファイルポインタはファイルの最後を指します。 rewind()を使用し、@Peterによって示唆されているように

fprintf(fp,"Hello2 World\n"); 
fflush(fp); 
fseek(fp, 0, SEEK_SET); 
fscanf(fp,"%s %s",x,y); 

あるいはさらに良い:

rewind(fp); 

rewind:あなたは、ファイルの開始時にファイルポインタを設定するfseek()を使用することができます

ストリーム に関連するファイル終了とエラー内部指標は、この関数の呼び出しが成功した後にクリアされ、すべてのエフェクトされていますこのストリーム上のungetcへの前回の呼び出しからのは破棄されます。

ストリームを更新(読み取り+書き込み)すると、巻き戻しを呼び出すと の読み書きが切り替わります。

戻りコードfscanf()も常にチェックすることをお勧めします。

バッファオーバーフローを回避するには、使用することができます。

fscanf(fp,"%9s %9s",x,y); 
+0

感謝を!私はあなたの答えを10分で受け入れます。それはまた、読み取りと書き込みの間にスイッチ用に準備する(ファイルが更新のためにオープンのための)効果を持つと(FP) –

+0

'巻き戻しは'、おそらく良いです。 – Peter

+0

@Peter - ありがとう、私は答えを更新しました。 –

関連する問題