K.Maebashi's BBS 投稿フォーム
ハンドル名
件名
Link
> 掲示板では一般にマルチポストは嫌われます。 > ただ、今回の例だと、時期がずれていて、質問内容も違うので、マルチポストに >当たるかどうかはわかりません。が、この手の掲示板を見ている人は、同じような >ジャンルの掲示板は見ていることが多い、ということは意識している必要があると >思います。かずまさんも、たまにこの掲示板にも登場されます。 > >>select関数についての振舞いについて調べています。 > >端末ドライババッファとstdinバッファの振舞いについて調べるのに、 >わざわざselectを使う必要があるのでしょうか。もちろん別にselectでもいいですが、 >getchar()とputchar()でもよいような。 >... >>端末ドライバのバッファやstdinバッファの中身を覗くにはどうすれば >>いいのでしょうか? > > 端末ドライバのバッファは覗けないと思います(少なくとも標準的な方法では)。 > 標準入力のバッファは、FILE構造体に紐づいていますから、stdio.hから >調べればよいでしょう。 > 私の環境(gcc (GCC) 3.4.2 (mingw-special))ではこうなっていました。 > >typedef struct _iobuf >{ > char* _ptr; > int _cnt; > char* _base; > int _flag; > int _file; > int _charbuf; > int _bufsiz; > char* _tmpfname; >} FILE; > > _baseがバッファの根元を押さえ、_cntが現在格納されているデータのサイズだと >想像し(外しているかも)、こんなプログラムを書いてみました。 > >#include <stdio.h> > >void dump_buffer(FILE *fp) >{ > int i; > printf("["); > for (i = 0; i < fp->_cnt; i++) { > putchar(fp->_base[i]); > } > printf("]\n"); >} > >int main(void) >{ > int c; > > while ((c = getchar()) != EOF) { > dump_buffer(stdin); > putchar(c); > } >} > >[実行結果] >C:\ctest>buffertest >aaa >[aaa] >a[aa] >a[a] >a[] > >bbb >[bbb] >b[bb] >b[b] >b[] > > それっぽく動いているように見えます。 > 重要なのは、標準入出力ライブラリの関数は、そのバッファリングのメカニズムを >含め、普通にCで、システムコールの上に実装されている、ということです。 >実装を想像すると、理解が深まると思います。
spamよけのため、ここに「ほげぴよ」と入力してください。
削除パスワード :
クリック!