2017-11-16 1 views
0

시스템 호출을 사용하여 파일 내용을 출력하려고합니다. 이 코드는 한 줄만 포함하는 파일이 생길 때까지 훌륭하게 작동합니다. 이 경우 출력은 첫 번째 문자가없는 행입니다. 이 숯불은 어디서 없어지나요?lseek를 사용할 때 첫 번째 바이트가 인쇄되지 않습니다.

ssize_t rres,wres; 
char buff[1]; 
off_t offset; 
int fd = open("tester.txt",O_CREAT | O_RDWR , 0664); 
int line_count = 5; 
for(count = 0;line_count != 0;count--){ 
    offset = lseek(fd, count, SEEK_END); 
    rres = read(fd,buff,1); 
    if(rres < 0){ 
     return -1; 
    } 
    if(*buff =='\n') line_count--; 

} 

count *= -1; // get abs value of bytes 
count++; 
while(count--){ 
    wres = write(STDOUT_FILENO,buff,read(fd, buff,1)); // output 
} 

파일의 마지막 5 줄을 출력하려고합니다. 하지만 5 라인 미만인 경우 첫 번째 문자는 출력되지 않습니다.

+0

'for' 루프는 무엇을하고 있을까요? – Barmar

+1

은 나머지 코드를 제공합니다. – achal

+0

업데이트 코드, 한 줄 누락되었습니다 –

답변

2

for 루프가 끝나기 전에 파일에서 문자를 읽는 중입니다. 적어도 5 행이 있다면 마지막으로 개행을 읽은 다음 나머지 개가 그 개행 후에 읽는 것을 시작합니다.

그러나 5 개의 개행을 찾지 않고 파일의 시작 부분에 도달하면 마지막 read()은 파일의 첫 번째 문자를 읽고 나머지 코드는 그 이후부터 읽기 시작합니다.

*buff != '\n' 그 문자를 먼저 인쇄해야합니다.

if (*buff != '\n') { 
    write(STDOUT_FILENO, buff, 1); 
} 
count *= -1; // get abs value of bytes 
count++; 
while(count--){ 
    wres = write(STDOUT_FILENO,buff,read(fd, buff,1)); // output 
} 
관련 문제