[324] Re:端末ドライバのバッファやstdinバッファの中身を覗くには?
投稿者:(ぱ)
2007/02/20 02:13:25
まず前回のコードにポカがあったので再掲します。ついでに色々いじりました。
> _baseがバッファの根元を押さえ、_cntが現在格納されているデータのサイズだと
>想像し(外しているかも)、こんなプログラムを書いてみました。
baseはおそらくバッファの根元を押さえているのでしょうが、バッファから
1文字消費されるたびに中身を移動させていくとは思えないので、
おそらく環状バッファか何かになっていて、現在バッファリングされている
内容の先頭は_ptrが抑えているのでしょう。
というわけで修正プログラムです。
#include <stdio.h>
void dump_buffer(FILE *fp)
{
int i;
printf("[");
for (i = 0; i < fp->_cnt; i++) {
if (fp->_ptr[i] == '\n') {
printf("<\\n>");
} else {
putchar(fp->_ptr[i]);
}
}
printf("]\n");
}
int main(void)
{
int c;
for (;;) {
dump_buffer(stdin);
c = getchar();
if (c == EOF)
break;
putchar(c);
}
return 0;
}
うちの環境での実行結果。
C:\ctest>buffer
[]
abcdefg
a[bcdefg<\n>]
b[cdefg<\n>]
c[defg<\n>]
d[efg<\n>]
e[fg<\n>]
f[g<\n>]
g[<\n>]
[]
さて、
>> C:\ctest>buffertest
>> aaa
>これはエコーバックですよね。
そうです。
>> [aaa]
>これはdump_buffer関数でのputchar、printf出力ですね。
そうです。
>> a[aa]
>aが一回だけ入力されているのにこのようになるのですかね??
ここに誤解があります。ここで左端に出ている[]に入らないaは、
エコーバックではなく、main()の中でputchar()されている文字です。
つまり、手で「aaa」と入力すると、バッファから1文字ずつ消費しながら
putchar()している、という様子を示しているわけです。
# でも、前回のプログラムに「abc」と入れると、変な出方をするのでした(^^;