2009-07-27 9 views
3

これは愚かな質問かどうかは確かではありませんが、すぐにわかります。getcとgetwc:stdinをどのように正確に読み込みますか?

getcgetwcがどのように機能するのかを正確に理解できていません。私はそれらを使用することはできませんが、私は彼らが何をしているのか正確にはわかりません。 intgetcは、私がprintf( "%c")した場合、ほとんどの文字を返します。

私の質問は:これらの機能がどのくらい正確に機能するのか、標準入力をどのように読み取るのですか正確に?説明とドキュメントへの良い指針は非常に感謝しています。

を編集してください。私がウィリアムの答えで残したコメントを読んでください。それは、後の詳細レベルを明確にするのに役立ちます。

答えて

3

8ビット文字のシステム(UCHAR_MAX == 255)の場合、getc()は単一の8ビット文字を返します。 intを返す理由は、EOF値を可能な文字値と区別できるようにするためです。これは、今日あなたが遭遇する可能性のあるほとんどすべてのシステムです。

マルチバイト文字を構成するバイトが別々に読み込まれ、別々に書き出されてから、コンソールでマルチバイト文字として解釈されるため、fgetc()がマルチバイト文字のために動作しているようです。あなたがあなたのprintfを変更した場合:

printf("%c ", somechar); 

(つまり、各文字の後にスペースを入れて)あなたは)おそらくかなり奇妙に見えるであろう、その構成バイトに分割マルチバイト文字が表示されるはずです。

1

答えはプラットフォームによって異なります。 Unixのようなマシンでは、getcはバッファ内で利用可能なデータがあるかどうかをチェックします。そうでない場合は、read()を呼び出してバッファ内のデータを取得し、次の文字を返し、ファイルポインタ(およびその他の詳細)をインクリメントします。詳細は異なる実装で異なり、実際には開発者にとって重要ではありません。

+0

)のおかげで、ウィリアムが、私はこれについてできるだけ多くの情報を希望。

呼び出しチェーンは少し退屈得ることができますが、あなたはそれを求め追跡。たとえば、「データ」と呼ばれるものは何バイトですか?何か?それは本当に文字を返しますか?キャラクターがマルチバイトで、まだ「OK」が印刷されている場合(「€」の場合と同様に)? –

+0

€がマルチバイトではない多くのエンコードがあります。とにかく、getc()がマルチキャラクタの入力ストリーム(例えばUTF-8でエンコードされたもの)からバイトを読み取る場合、文字が画面に表示されるまで、さらに2つのgetc/putc呼び出しが行われることを意味します。 getcはunix上で一度に1バイトを読み込みます。 – nos

1

実際の動作を知りたい場合は、ソースをglibcにチェックしてください。手始めに

libio/getc.cからgetc()libio/libio.hで定義されている_IO_getc_unlocked()を、呼ぶとアンダーフローにlibio/genops.cから__uflow()を呼び出します。

関連する問題