오랫만에 글을 씁니다. 이번 시간에는 파일 포인터를 넘겨주면 파일 디스크립터를 돌려주는 fileno 함수를 배워보겠습니다. 사실 빠른 입출력을 위해 많이 쓴다는 fastio의 write를 배우기 위해서, 배운다는 건 비밀이지만요.
이 함수의 원형은 다음과 같습니다.
stdio.h에 선언이 되어 있는 함수입니다. FILE 포인터를 넘겨주면, 그것과 연관된 파일 디스크립터를 돌려주는 역할을 합니다.
stdio.h에 보시면 bits/types/FILE.h가 보이는데요. 무엇인지 모르겠지만, 저기에 무언가가 있을 듯 싶으니, 타고 들어가 보겠습니다.
그러면, _IO_FILE이라는 것을 FILE로 재정의를 한 무언가가 보이는데요. 글쎄요. 일단, 이것도 타고 들어가 보겠습니다.
그러면 _IO_FILE 구조체가 보이는데요. 밑으로 타고 내려가다 보면, 뜬금없이 이상한 변수들이 나옵니다.
_fileno가 보이는데요. 여기까지 보면 FILE에 관한 것을 담고 있는 무언가가 fileno도 같이 담고 있다는 것을 볼 수 있어요. 그렇다면, 파일에 대한 정보를 담고 있는 것을 토대로, 디스크립터 번호를 가져온다고 생각하셔도 무난하겠군요. fastio에 나오는 write 함수를 실험해 보기 위해서는 이 번호를 알아야 한다는 것도 챙겨가시면 좋을 듯 싶습니다.
이제 예제를 보도록 하겠습니다.
write 모드로 1.txt를 엽니다. 파일 포인터 fp는 이것과 연관이 되어 있습니다.
다음에, FILE과 연관된 무언가에서, 파일 디스크립터를 가지고 옵니다. FILE 포인터로부터 번호를 얻어온 셈입니다. 그리고, 이 번호를 1번째 인자로, 버퍼를 2번째 인자로, 3번째 인자로 길이 정보를 넣어서 파일에 씁니다. 이것을 조금 더 응용하면, 고수 분의 글 처럼 이렇게도 쓸 수 있습니다. Fast Output만 보셔도 되겠네요. 당연하게도 저 글은 즐겨찾기 해 두시면 좋습니다. 나중에 OS 카데고리에 글을 쓸 때도 나올 것이거든요. 공룡책에서 2 ~ 4 단원 정복할 정도의 글감을 저 글 하나에서 뽑아낼 수 있기도 하고요.
결과는 위와 같습니다. 단지, 우리는 파일 디스크립터를 받아서, write를 했을 뿐입니다.
이제, 먼저 파일을 닫고 (스트림 같은 것도 닫힐 겁니다), 그것을 디스크립터로 바꾸어 보겠습니다.
-1이 떨어지네요. 이는, fp와 연관이 된 스트림이 유효하지 않기 때문입니다.
'코딩 > C' 카테고리의 다른 글
c언어 조건부 전처리기 #if #ifdef 를 알아봅시다. (0) | 2020.12.26 |
---|---|
10시간동안 원인 찾아 헤멨던 string c_str과 dangling pointer (0) | 2020.09.16 |
왜 fopen 으로 열면 fclose 함수로 닫아주어야 할까요? (0) | 2020.09.02 |
c언어 define문 : 상수를 정의할 때 쓴다. (0) | 2020.07.18 |
c언어 fwrite 함수 : 레코드를 byte 단위로 쓴다. (0) | 2020.05.31 |
최근댓글