3

キーボードキャプチャの場合はc。次のコードは、矢印キー/escが押されたときに検出されます。同時に、ユーザーが入力した単語全体を読みたいので、これらはstdoutにも表示されるはずです。

char pp = 0;
char p = 0;
while( (i = read(0, &c, 1)) == 1) {
if (pp == 033 && p == 0133 && (c &= 255) == 0102) /* DOWN */ break;
if (c == 0177) /* ASCII DELETE */ break;
printf( "%o, %o, %o\t%s\n\r", pp, p, c, &c);
pp = p;
p = c; 
}
...
...
getchar(); //I want to capture here what was entered before
           //  **return key** was pressed.

しかし、'\ n'を削除すると、このコードは機能しません。stdoutが通常のシェルとして動作するようにしたい。

4

3 に答える 3

3

printf(3)および<stdio.h>を含むバッファ付きI/O機能を通過します。通常のラインバッファリング動作を観察しています。で述べたように、このバッファリングを無効にすることができますが、そもそもそれを望まず、すでに読み取りに直接カーネル呼び出し()を使用しているので、ロジックを少し変更してカーネルを直接呼び出すのはなぜですか?同じように?fputs(3)fputc(3)setbuf(3)read(2)write(2)

char buffer[100];

int n;

n = snprintf(buffer, sizeof buffer, "format string...", args...);
write(1, buffer, n)

また、必要に応じて、独自のdirectPrintfを定義して、これを簡単にすることができます。

#include <stdio.h>
#include <stdarg.h>
#include <unistd.h>

int directPrintf(const char *format, ...)
{
va_list ap;
char buffer[200];

    va_start(ap, format);
    int n = vsnprintf(buffer, sizeof buffer, format, ap);
    va_end(ap);
    return write(1, buffer, n);
}
于 2009-10-03T19:03:17.430 に答える
1

getchar()read()おそらく、1バイトをはるかに超える(通常は全体PIPE_BUF、または4096バイト)を読み取るという観点から実装されます。次に、そのバッファへのプライベートカーソルを維持し、必要に応じてバイトを抽出します。

これは、単に呼び出すread()ことに関連する重要なオーバーヘッドがあるために行われます。

printf()、およびfwrite()(およびなど)も同じ理由でバッファリングされます(write()重要なオーバーヘッドがあります)。toの呼び出しは、バッファリングされているものfflush(stdout)の呼び出しに変換されwrite()ますが、基になるIOポートには送信されません。

最後に、\n\r後方にあります。ほぼ確実に\r\n

于 2009-10-03T17:12:44.590 に答える
0

入れる

setbuf( stdout, NULL);

開始時にどこかで\nを削除します。

于 2009-10-03T17:13:27.133 に答える