2014-09-28 2 views
0

getchar()을 사용하여 입력을 읽을 때 문자를 전송하는 데 사용 된 개행 문자와 입력 된 문자를 소비해야합니다.C : Read() 및 개행 문자 사용

그러나 read()를 사용하여 입력을 버퍼로 읽으려고합니다. 프로그램이 키보드 또는 입력 파일에서 읽을 수 있습니다. 프로그램에 문자를 입력하면 문자와 개행 문자가 읽히지 만 첫 문자를 넘어 입력 된 문자는 버퍼로 읽히지 않습니다. 나는이 작품을 읽는 방법 오해

Ready to read. 
a 
First status: 2. 
Read a : a 
Ready to read. 
b 
First status: 2. 
Read a : newline 
Ready to read. 
a 
First status: 2. 
Read a : 
Ready to read. 
b 
First status: 2. 
Read a : 
Ready to read. 
g 
First status: 2. 
Read a : 
Ready to read. 
e 
First status: 2. 
Read a : 
Ready to read. 
First status: 0. 
Read a : 
Printing read in chars: 
e 
newline 
(blank) 
(blank) 
(blank) 
(blank) 
(blank) 

오전 : 나는 그것을 실행할 때

#include <stdlib.h> 
#include <sys/types.h> 
#include <unistd.h> 
#include <stdio.h> 

    int main (int argc, char *argv[]) 
    { 

     //Success/failure of read 
     int read_status = 1; 
     //Success/failure of write 
     int write_status = 1; 
     //Buffer for reads/writes 
     char buffer[BUFSIZ] = {0}; 
     int charsRead; 

     for(charsRead = 0; charsRead < BUFSIZ && read_status > 0; charsRead++) 
     { 
      fprintf(stderr, "Ready to read.\n"); 
      read_status = read(0, buffer, 2); 

      fprintf(stderr, "First status: %i.\n", read_status); 

      fprintf(stderr, "Read a : "); 
      if(buffer[charsRead] == '\n') 
      { 
       fprintf(stderr, "newline\n"); 
      } 
      else if(buffer[charsRead] == ' ') 
      { 
       fprintf(stderr, "space\n"); 
      } 
      else 
      { 
       fprintf(stderr, "%c\n", buffer[charsRead]); 
      } 
     } 

     fprintf(stderr, "Printing read in chars: \n"); 
     for(int i = 0; i < charsRead; i++) 
     { 
      if(buffer[i] == '\n') 
      { 
       fprintf(stderr, "newline\n"); 
      } 
      else if(buffer[i] == ' ') 
      { 
       fprintf(stderr, "space\n"); 
      } 
      else 
      { 
       fprintf(stderr, "%c\n", buffer[i]); 
      } 
     } 
    } 

그래서,이 출력을 생성? 새 줄을 사용하려고 시도한 후 첫 번째 줄 뒤에 다른 줄을 추가하려고 시도했지만 문제가 해결되지 않습니다.

이 프로그램은 stdout (파이프가 될 것임)에도 쓰고 있습니다. 이 사건을 위해 특별히 고려해야 할 사항이 있습니까?

답변

0

그래서, 관심있는 모든 사람들을 위해 나는 대답을 알아 냈습니다. 문제는 버퍼를 따라 포인터를 이동시키지 않아 첫 번째 인덱스를 반복하여 덮어 쓰고 있었다는 것입니다.

for(bytesRead = 0; bytesRead < BUFSIZ && read_status > 0; bytesRead++) 
{ 
    read_status = read(0, buffer + bytesRead, 1); 
} 
:

그래서,이 내가 일하는 그것을 가지고 어떻게