read()에 대한 질문입니다
글쓴이: ch0nn0m / 작성시간: 금, 2009/07/31 - 10:38오후
#include<stdio.h> #include<fcntl.h> int main() { int fd; int str; char buf[20]; fd=open("apple.dat", O_RDONLY); while(str=read(fd,buf,sizeof(buf))>0); { printf("str=%d\n",str); printf("buf=%s",buf); printf("buf의 문자열 길이=%d\n",strlen(buf)); } }
파일 apple.dat에는
apple
orange
banana
blueberry
이렇게 있습니다
결과는...
str=0
buf=blueberry
ge
banana
퓾@8???uf의 문자열 길이=34
이렇게 나오는 이유가 뭔지요??
str에는 성공시 수신한 바이트 수가 들어가는게 아닌지요??
Forums:
_
read에는 잘못된 게 없지만, 코드의 while문이 잘못되었습니다.
while(str=read(fd,buf,sizeof(buf))>0);
str=read(...)>0에서 str에는 read(...)와 0을 비교한 TRUE/FALSE 값이 들어갑니다. 예를 들어 read(...)에서 10이 나왔다면 str = (10>0), 즉 str = 1이 대입됩니다. 정상적으로 동작하려면 (str = read(...)) > 0과 같이 대입이 먼저 일어나도록 괄호를 붙여 주어야 합니다.
while 끝의 ;도 문제가 됩니다. while(...);는 while(...){}과 같이 ... 내부의 조건문이 참일 동안 '아무 일도 하지 않는' 코드가 됩니다. 그러면 해당 코드는 read가 다 끝날 동안 아무 일도 하지 않다가 파일을 다 읽고 read에서 0을 리턴할 때 밑의 세 줄 printf가 작동하게 됩니다.
몇 가지를 더 짚어보면:
buf가 출력된 데이터를 보면 blueberry 이후에 banana가 들어가있는 것을 볼 수 있습니다. 첫번째 read에서 20바이트가 buf로 들어간 다음에 두번째 read가 불릴 때 blueberry가 그 위에 덮어씌워졌다는 의미입니다.
buf 출력의 끝에서는 쓰레기 데이터가 출력되어 있고, strlen에서는 buf의 원래 크기보다도 큰 34가 나왔습니다. read에서는 문자열 끝에 NULL을 붙여주지 않습니다.
파일에서 읽은 바이트 수를 저장하기에 int str;이라는 변수명은 그리 좋지 않을 것 같네요. nbytes나 size 등의 이름을 사용하는 편이 나중에 착각으로 인한 버그를 줄여줍니다.
댓글 달기