JC Tailor

블로그 이미지
컴퓨터를 사랑하자.~
dkcjs3

Article Category

분류 전체보기 (52)
프로그램방법론 (0)
Tailor 이야기 (0)
C언어 이야기 (49)
C++ 이야기 (1)
API 이야기 (0)
MFC 이야기 (0)
Window XP 이야기 (0)
컴퓨터정보 (1)
나의 삶 이야기 (1)
UNIX (0)

Recent Comment

Recent Trackback

Calendar

«   2007/08   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

Archive

  • Total24,658
  • Today0
  • Yesterday6
  1. 2007.08.03
    저수준의 화일 입출력
  2. 2007.08.03
    tmpnam();
저수준의 화일 입출력에서는 FILE이란 구조 대신 간단하게 각 화일마다 번호를 사용하는데, 이를 화일 식별자(file descriptor), 또는 핸들(handle)이라고 합니다. 이 핸들은 0 이상의 값을 가지고 있는데 실제로 0과 1, 2 는 고정된 의미(핸들 0은 표준 입력을 위한 번호이며 1은 표준 출력, 그리고 2는 표준 에러로 사용)를 갖고 있어서 화일을 처음 열게 되면 그 화일의 핸들은 3이 됩니다.
핸들의 의미는 이후에 win32 프로그래밍 강좌를 할 때 자세히 다루기로 하고 여기서는 그냥 화일 구별할 수 있는 식별자 정도로 이해 하시면 됩니다.

저수준의 화일 입출력에서도 화일을 사용하기 위해서는 화일을 먼저 열어야 하며, 이때 다음과 같이 open 함수를 사용합니다.
        int fd;
        fd = open("화일 이름", 액세스 방식[, 모드]);

위에서 [ ]는 역시 생략할 수 있는 부분을 의미하며, 화일 이름은 fopen과 같이 열 화일의 이름이고 액세스 방식은 이 화일을 어떻게 열 것인가인데, fopen과는 달리 다음과 같은 형태로 사용합니다.

-----------------------------------------------------------
   모드            값                                     내  용
-----------------------------------------------------------
O_RDONLY    0x0001   읽기 전용으로 화일을 엽니다.
O_WRONLY    0x0002   쓰기 전용으로 화일을 엽니다.
O_RDWR        0x0004   읽고 쓰기 위해 화일을 엽니다.
O_CREAT       0x0100  화일이 없을 경우 새로운 화일을 만듭니다.
O_TRUNC       0x0200  현재 있는 화일의 내용을 0으로(제거) 합니다.
O_EXCL         0x0400   O_CREAT과 함께 사용하며,
                                  화일이 없을 경우에만 엽니다.
O_APPEND     0x0800   화일을 쓰기용으로 열고 화일 포인터를
                                   화일의 끝에 위치시킵니다.
O_TEXT         0x4000   화일을 텍스트 형식으로 엽니다.
O_BINARY      0x8000   화일을 이진 형식으로 엽니다.
-----------------------------------------------------------

위의 O_로 시작하는 것들은 모두 상수로 이의 정의는 fcntl.h(이것은 file control의 약자)에 들어 있기 때문에 include 문을 사용하려면 반드시 fcntl.h를 포함하여야 합니다.
위의 것들은 액세스 방식의 한 조건들로 여러 개를 동시에 같이 사용할 수 있으며 이 때에는 각 조건들을 '|'(비트 연산자 OR)를 이용해서 묶으면 됩니다.
data.dat 란 화일을 읽기 전용으로 열고자 할 때에는 다음과 같이 하면 됩니다.
        fd = open("data.dat", O_RDONLY);

그리고 기존의 화일이 있으며, 이를 지우고 쓰기 전용으로 열 때에는 다음과 같이 하면 됩니다.
        fd = open("data.dat", O_WRONLY | O_TRUNC);

O_TRUNC이 추가 되었는데, 만약 이를 써 주지 않으면 쓰기 전용이라도 화일의 내용은 없어지지 않습니다. 반면에 화일의 끝에 추가하고자 할 때에는 다음과 같이 O_APPEND를 써 주면 됩니다.
        fd = open("data.dat", O_WRONLY | O_APPEND);

fopen 문과 다른 것은 해당 화일이 없는 경우 화일이 만들어지지 않는다는 것입니다. 만약 화일이 없을 때 화일을 만들도록 하고 싶으면 다음과 같이 O_CREAT를 지정하여야 하며, 이 때에는 세번재 인자가 필요합니다.
        fd = open("data.dat", O_WRONLY | O_CREAT | O_TRUNC, 모드);
                    /*  화일이 있으면 그 내용을 지우고 없으면 생성, fopen의 "w"와 같음  */
        fd = open("data.dat", O_WRONLY | O_CREAT | O_APPEND, 모드);
                  /*  화일이 있으면 그 끝으로 이동하고 없으면 생성, fopen의 "a"와 같음  */

세번째 인자인 모드에는 액세스 방식에서 O_CREAT 플래그가 지정된 경우, sys\stat.h(TC의 경우)에 정의되어 있는 다음 기호 중 하나가 사용됩니다(일반적으로 8진수 0700을 주면 됩니다).
        S_IWRITE               /*  써 넣기 가능  */
        S_IREAD                /*  읽어 내기 가능  */
        S_IREAD | S_IWRITE     /*  읽기 / 쓰기 가능  */

읽기용 화일에서는 모드를 생략해도 화일의 사용에는 별 지장이 없습니다.

그밖에 O_RDWR은 읽고 쓰고자 할 때 사용하며 O_EXCL은 O_CREAT하고만 같이 사용하는데, 지정한 화일이 있으면 에러가 납니다. 즉 화일이 없는 상태에서 새로 만들고자 할 때에는 O_EXCL과 O_CREAT를 같이 사용하면 됩니다.
신고
Trackback 0 and Comment 0

사용자 삽입 이미지


신고
Trackback 0 and Comment 0

Tag Cloud


티스토리 툴바