fconfigure
を使用すると、チャンネルオプションを取得して設定できます。 -buffering
は、バッファリングのタイプを指定します。デフォルトでは、はstdin
です。TCLでstdinバッファが空であるかどうかを確認するには?
stdin
のバッファが空であるかどうかを確認する方法はありますか?
この質問を参照してください:How to check if stdin is pending in TCL?
fconfigure
を使用すると、チャンネルオプションを取得して設定できます。 -buffering
は、バッファリングのタイプを指定します。デフォルトでは、はstdin
です。TCLでstdinバッファが空であるかどうかを確認するには?
stdin
のバッファが空であるかどうかを確認する方法はありますか?
この質問を参照してください:How to check if stdin is pending in TCL?
明らかにあなたは非ブロックにチャネルモードを設定し、それから読み取ることができます。読取り値が0の場合、使用可能なものはありません。しかし、私はあなたがそこにバッファリングしている行のあなたの言及を与えられた完全な行ではなく、存在するデータをテストすることを意味すると思う。 fblockedコマンドは、このためにチャネルをテストします。詳細については、fblocked(1)を参照してください。しかし、ラインバッファリングされたチャンネルの場合、不完全なラインが存在することがわかります。
対話型スクリプトコマンドを読み込んでいる場合は、stdinを読むときに便利なもう1つのコマンドは、info completeコマンドを使用することです。これにより、info completeがtrueを返し、バッファ全体を1つに評価するまで、行を蓄積することができます。
Tclの入力バッファをchan pending input stdin
(少なくともTcl 8.5以上必要)で確認できます。これは、OSにバッファに何かがあるかどうかを示すものではありません。それらは、少なくとも1バイトが存在するときに読み取り可能なfileevent
をトリガーするスクリプトを使用してデータ(gets
またはread
)またはを読み取ろうとすることによってチェックされます。実際に約束されているのは、1バイトの読み込みがブロックされないということですが、すぐにエラーが発生するエラー状態が原因である可能性があります。これは、OSレベルのファイルディスクリプタの準備がどのように機能するかのセマンティクスです。
-buffering
オプションは出力チャネルにのみ影響します。 stdin
(または他の読み取り専用チャンネル)では役に立たず、まったく効果がありません。本当に。
私はこれが古い質問だと知っていましたが、私の最後の研究が始まりました。fileevent
という名前の関数が見つかったので、ストリーム、すなわちstdinそれには読めるものがあります。それは役に立つかもしれません。
[同じマンページの8.6バージョン(http://www.tcl.tk/man/tcl8.6/TclCmd/fblocked.htm)がソケットのために働いた例(含みます、特別なイベント処理ではありません)。 –
また、 'info complete'を使用している場合は、読み込まれたばかりの行を含めて、各行の最後に改行を置いておく必要があります。 –
'fblocked stdin'は' gets'で動作しますが、 'read stdin Number'では動作しません。 'stdin -blocking false'モードで' read stdin BigNumber'は 'gets'のように動作するので、改行記号が残っていない文字があると空の文字列を返します。しかし、この場合、 'read stdin BigNumber'の呼び出しの後、' fblocked stdin'はfalseを返します。 – Vahagn