(注: これはをフラッシュする方法の問題ではありません。いわば、write()
これはもう一方の端です。)
データを読み込む必要がないファイル記述子を空にすることはできますかread()
? データに興味がない場合は、すべてを読み取ると、より適切に使用できるスペースとサイクルが浪費されます。
POSIX でそれができない場合、これを行うための移植性のない方法があるオペレーティング システムはありますか?
更新:ストリームではなく、ファイル記述子について話していることに注意してください。
(注: これはをフラッシュする方法の問題ではありません。いわば、write()
これはもう一方の端です。)
データを読み込む必要がないファイル記述子を空にすることはできますかread()
? データに興味がない場合は、すべてを読み取ると、より適切に使用できるスペースとサイクルが浪費されます。
POSIX でそれができない場合、これを行うための移植性のない方法があるオペレーティング システムはありますか?
更新:ストリームではなく、ファイル記述子について話していることに注意してください。
ttyを扱っている場合は、以下をご覧くださいtcflush()
。
#include <termios.h>
int tcflush(int fildes, int queue_selector);
正常に完了すると、tcflush() は、fildes (端末に関連付けられた開いているファイル記述子) によって参照されるオブジェクトに書き込まれたが送信されなかったデータ、または受信されたが読み取られなかったデータを、queue_selector [...] の値に応じて破棄します。
POSIXの場合は、lseek(2)
またはlseek64(3)
を使用して先に進みます。Windowsの場合は、SetFilePointer()
またはを使用しますSetFilePointerEx()
。
スキップするバイト数がわかっている場合はlseek(fd, n, SEEK_CUR);
、POSIX システムで行うことができます。fseek()
オブジェクト用もありFILE *
ます。POSIX では、ファイルの終わりを超えて安全にシークできると思います。後でさらにデータが書き込まれるとlseek()
、 で設定された位置を超えてデータが移動するようになり、より多くのデータを読み取ることができるようになるという考えです。
Linux 2.6.17 以降と GNU C ライブラリ バージョン 2.5 以降にはシステム コールが含まれており、このsplice()
システム コールを使用して、あるファイル記述子から別のファイル記述子にデータをユーザー空間にコピーせずに送信できます。これを使用して、ソースファイル記述子からファイル記述子にデータを開い/dev/null
てsplice
ing するだけで、データを破棄でき/dev/null
ます。
ストリームには、書き込みバッファーをフラッシュし、読み取りバッファーを IO システムに戻す fclean が用意されています。
http://www.gnu.org/software/hello/manual/libc/Cleaning-Streams.html
本当にやりたいことがバイトをスキップする場合は、ファイル ポインターの位置を変更するのが正しいアクションです。読みたくないバイト数だけ先にスキップしてください。
http://www.gnu.org/software/hello/manual/libc/File-Position-Primitive.html#File-Position-Primitive
read() も flush() も標準 C または C++ の一部ではありませんが、入力ストリームのフラッシュをサポートする標準関数はありません。これは、基盤となるオペレーティング システムで利用できないものを反映していると思います。何かを完全に読み取らないようにする通常の方法は、何らかの seek() 関数を使用してスキップすることです。
これによると、POSIX システムは でこれを行いfflush(stream);
ます。
読み取り用に開いているストリームの場合、ファイルがまだ EOF になっておらず、そのファイルがシーク可能なファイルである場合、下にある開いているファイル記述のファイル オフセットを調整して、開いているファイル記述に対する次の操作がそのファイル記述を処理するようにします。フラッシュされるストリームから読み取られた、またはストリームに書き込まれた最後のバイトの後のバイト。