2011-11-16 7 views
1

ユーザからの入力を読み込んで(複数行)、fputs()を使ってファイルに書きたいと思っていました。ここでfgetsを使って複数の入力行を読み込み、Cのfputsを使ってファイルに書き込む方法は?

私のコードは、ユーザからの入力を取得した後

#include<stdio.h> 
#include<stdlib.h> 
int main() 
{ 
FILE *fp; 
char s[25]; 
fp=fopen("myname","w"); 
if(fp==NULL) 
{ 
    perror("Error opening file\n"); 
    exit(1); 
} 

while(fgets(s,25,stdin)!=NULL) 
    fputs(s,fp); 
fclose(fp); 
return 0; 
} 

ですが、私はプログラム(私はLinuxを使用しています)の入力プロンプトを閉じるにはCtrl + Cを使用しています。それから私はファイルを開いて、それは何も含まれていません。どうすればこの問題を解決できますか?

fputs()& fgets()の使用に問題はありますか?

+0

あなたのコードは25バイトの行に壊れます。あなたは 'fgets(s、sizeof(s)-1、stdin)'を使うことができ、 'memeset(s、0、sizeof(s));そして 'getline'はこれのためのより良い関数です(それは行を動的に割り当てるためです)。 –

+0

@BasileStarynkevitch、 'fgets'のmanページは、' fgets()はストリームからサイズ文字より1つ小さい文字を読み込み、それらがsで指されたバッファに格納すると言います。 '\ 0'はバッファ内の最後の文字 'になります。だから、 'fgets()'の呼び出しで25を持つことは安全です。私はこのコードを25文字より長い行でテストしました。動作しない理由は、バッファリングです。 'fflush(fp)'を追加するとそれが解決されました。 後半のコメントをお詫び申し上げます。 – Bhaskar

答えて

3

バッファリングのためにC-Cがプロセスを強制終了する可能性があるため、行がファイルに到達しません(バッファがいっぱいで、バッファがいっぱいでない限り)。

C-D(Unix)またはC-Z(Dos)の出力をC-Cではなく終了する必要があります。

注:fgetsは改行を削除せず、fputsはそれ自身を追加します。しかし、私はあなたがそれに気づくだろうと思っています:-)

+0

おかげで、あなたは正しいです。今、私は、適切な出力を得る:) – Dinesh

関連する問題