[완료]파일 디스크립터와 파일 포인터 사용시 의문점.
글쓴이: pchero / 작성시간: 화, 2008/01/22 - 12:26오후
네트워크 프로그래밍을 공부하다가 의문이 떠올랐습니다.
순전히 호기심에 다음과 같은 코드를 실행해 보았는데 조금 이상한 결과가 나왔습니다.
#include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> void error_handling(char *message); int main(void) { int fildes; FILE *fp; fildes = open("data.dat", O_WRONLY | O_CREAT | O_TRUNC); if(fildes == -1) error_handling("open() error!"); /* 파일 디스크립터를 이용하여 파일 포인터 생성 */ fp = fdopen(fildes, "w"); write(fileno(fp), "This is write funcion1!! \n\n", 27); fputs("This is fputs function!! \n\n", fp); write(fileno(fp), "This is write funcion2!! \n\n", 27); fclose(fp); return 0; } void error_handling(char *message) { fputs(message, stderr); fputc('\n', stderr); exit(1); }
이것은 실행화면 입니다.
여기서 궁금한 것이....
하나의 파일 디스크립터를 파일 포인터로 변환해서 같은 파일에 글을 쓰고 있는데...
결과를 보시면 호출하는 순서에 상관없이 디스크립터를 이용하여 입력한 데이터가 파일의 처음부분에 나오고 포인터를 이용해서 입력한 데이터가 파일의 마지막 부분에 나옵니다.
저는 호출한 순서에 맞게끔 입력이 될줄 알았는데...왜 이런 결과가 나오는 것인가요..?
File attachments:
첨부 | 파일 크기 |
---|---|
![]() | 23.54 KB |
Forums:
fp를 통한 read/write는 c
fp를 통한 read/write는 c library에서 자체적으로 버퍼를 가지고 있을 겁니다.
읽어올때도 요청된 것만큼(이상) 충분히 읽어오고,
적절한 만큼 쌓인 후에야 실제 쓰기를 수행하구요.
감사합니다 fputs("Thi
감사합니다
처럼 fputs() 이후에 fflush() 함수를 넣어주니 생각대로 결과값이 잘 나왔습니다
감사합니다 : )
---------------------------------
제일 왼쪽이 저입니다 :)
---------------------------------
제일 왼쪽이 저입니다 :)
매번 fflush() 하는
매번 fflush() 하는 부담까지 없애려면 setvbuf() 를 사용하면 됩니다.
아예 버퍼링을 하지 않거나, 라인단위로만 버퍼링을 하거나 등등 선택의 여지도 많습니다.
댓글 달기