2009-10-03 3 views
2

c 뒤에 getchar()을 사용합니다. 화살표 키/esc를 누르면 다음 코드가 나타납니다. 동시에 나는 사용자가 입력 한 모든 단어를 읽고 싶은데 stdout에 표시해야합니다.키보드 캡처를 위해 read()

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이 정상적으로 동작해야합니다.

답변

2

printf(3)fputs(3)fputc(3)을 포함하는 <stdio.h> 버퍼링 된 I/O 기능을 거칩니다. 정상적인 회선 버퍼링 동작을 관찰하고 있습니다. 그러나 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); 
} 
0

getchar()은 1 바이트 이상 (일반적으로 전체 PIPE_BUF 또는 4096 바이트)을 읽는 read()으로 구현 될 가능성이 큽니다. 그런 다음 필요에 따라 바이트를 추출하여 해당 버퍼에 대한 개인 커서를 유지합니다.

이 작업은 read()과 연결된 간단한 오버 헤드가 있으므로입니다.

printf()fwrite() (및 등)도 동일한 이유 (write()은 단순한 오버 헤드를 갖는다)로 버퍼링한다. fflush(stdout)에 대한 호출은 버퍼링되었지만 기본 IO 포트로 전송되지 않은 것의 write() 호출로 변환됩니다.

마지막으로 \n\r가 있습니다. 거의 확실 \r\n

0

삽입 시작시

setbuf(stdout, NULL); 

곳을해야하며 \ n을 제거하기로했다.