3

c 用于键盘捕获。以下代码查找何时按下箭头键/ esc。同时,我想阅读用户输入的整个单词,这些单词也应该显示在标准输出上。

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',此代码将不起作用。我希望标准输出应该表现得像一个普通的外壳。

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 个字节)的 a 来实现。然后它维护一个指向该缓冲区的私有游标,根据需要提取字节。

这样做是因为调用read()它会产生不小的开销。

printf(), 和fwrite()(and etc) 也出于同样的原因缓冲(write()具有不平凡的开销)。调用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 回答