dポイントプレゼントキャンペーン実施中!

getc
gets
getchar
ungetc
ungetchar
fgetc

の違いがいまだによくわかっていません・・。
getc は getchar と全く同じなんですか??
それと、gets は getc の行バージョンと思えばいいのでしょうか。
fgetc は fopen の中で使うgetc と思えばいいのですか?
変な質問かもしれませんが、頭が混乱中です^^;
 

A 回答 (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()と同様だと思います。
    • good
    • 1

プロトタイプを比較してみましょう。



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()によってバッファなしに設定されているファイルに対して呼び出すことは出来ません。
もし、呼び出した場合は無視されます。
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!