- ベストアンサー
getc 等の違い
getc gets getchar ungetc ungetchar fgetc の違いがいまだによくわかっていません・・。 getc は getchar と全く同じなんですか?? それと、gets は getc の行バージョンと思えばいいのでしょうか。 fgetc は fopen の中で使うgetc と思えばいいのですか? 変な質問かもしれませんが、頭が混乱中です^^;
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
お答えします。 これら入力関数の違いは、 「入力する場所が、『標準入力』か『ストリーム』か」 「入力するものが『文字』か『文字列(行)』か」 で分類されます。 「標準入力」というのは、通常、キーボードからの入力を意味します。 それに対し、「ストリーム」というのは、fopen()を使って、FILE*を経由して入力をすることです。 fgets()を使うときこういうことするでしょ? FILE *file; char string[100]; file = fopen("abc.txt"); fgets(string, 100, file); 「abc.txt」というファイルと、プログラムの間にストリーム(流れ)を渡して、 データを流せるようにします。 ファイルからデータを入力できるようになります。 また、ここでfileの変わりにstdinを使うとキーボードから入力できます。 キーボードからの入力もできるし、ファイルから入力することもできるのです。 入力関数をまとめるとこうなります。 標準入力・文字 : getchar() 標準入力・行 : gets() ストリーム入力・文字 : fgetc(), getc() ストリーム入力・行 : fgets() ただし、それぞれ使い方(引数の数とか)が違うので、 詳しいことはC言語の資料を見てください。 なお、「ストリーム入力・文字」が二つあるのは、歴史的な理由です。 原則的には同じものと思ってかまいません。 あと、ungets()は、getc()等で読んだ文字を、 「読まなかったことにして」と押し返す関数です。 普通、使う機会は少ないと思います。あまり考えなくていいでしょう。 ungetchar()というのは知りませんが、ungetc()と同様だと思います。
その他の回答 (1)
- toysmith
- ベストアンサー率37% (570/1525)
プロトタイプを比較してみましょう。 int getc(FILE*) ; char *gets(char *) ; int getchar(void) ; int ungetc(int, FILE *) ; int fgetc(FILE *) ; int ungetchar(int) ;はANSI-C標準ではありません。 getchar()はgetc(stdin)と同じです。 gets()はgetchar()の行バージョンと考えることが出来ますが、入力行がそのまま返されるという保証がありません。 少なくとも、EOL(改行や改ページなど)は削除されます。 fgetc()とgetc()はよく似た動作をしますが、【全く同じ】という保証はありません。 fopen()でFILE *を取得している場合、getc()を使います。 ungetc()は入力されたデータを1文字入力元に戻す、という特殊な関数です。 実際にはファイルではなく、FILE *で管理する入力バッファいに戻されます。 ungetchar()が存在する処理系ではungetchar(c)はungetc(c, stdin)と同じ動作をする可能性が高いと思います。 ただし、ungetc()/ungetchar()はsetbuf()によってバッファなしに設定されているファイルに対して呼び出すことは出来ません。 もし、呼び出した場合は無視されます。