42SEOUL

[C] File 종류와 함수

daykim 2022. 3. 8. 14:27

파일의 종류

텍스트 파일 (Text File)

.txt 확장자를 가지는 파일

사람의 눈으로 쉽게 읽을 수 있는 파일로 문서 편집기를 통해 읽거나 편집 가능한 파일

이러한 형태의 파일은 데이터가 그대로 노출되는 문제가 발생할 수 있다.

바이너리 파일 (Binary File)

컴퓨터를 위한 파일

사람의 눈으로 식별할 수 있는 데이터가 아닌 기계가 식별할 수 있는 0 또는 1로 만들어진 데이터를 저장한 파일의 형태

텍스트에 비해 더 많은 양을 저장할 수 있지만, 눈으로 식별하기 쉽지 않다.

데이터가 그대로 노출되지 않기 때문에 텍스트 파일보다 안전

 

File 함수

open

파일을 여는 함수

int open(const char *pathname, int flags[, mode_t mode]);

pathname : 파일명

mode : 접근권한

return 

  • 성공 : 양의 정수
    • file descriptor로 현재 열려있지 않은 가장 작은 값으로 배정된다.
      해당 fd는 시스템콜이 열려있는 파일을 참조할 때 사용한다.
  • 실패 : -1

file descriptor로 현재 열려있지 않은 가장 작은 값으로 배정된다.

헤더파일 : <fcntl.h>

 

close

파일을 닫는 함수

int close(int fd)

fd : 닫으려는 파일의 파일 식별자

return

  • 성공 : 0
  • 실패 : -1

헤더파일 : <fcntl.h>

 

read

파일을 읽는 함수

size_t read(int fd, void *buf, size_t nbytes)

헤더파일 : <unistd.h>

fd : 파일 식별자

buf : 데이터를 저장하는 버퍼

nbytes : 읽어올 데이터의 byte 수

return

  • 성공 : 읽은 byte 수
  • 0 : read 시스템 콜이 EOF를 알려줄 때
  • 실패 : -1, 오류가 발생한 경우, 상세한 오류는 errno에 설정된다.
    • EAGAIN : 현재 읽을 데이터가 없어 함수 바로 return
    • EAGAIN || EWOULDBLOCK : 읽을 데이터를 수신하지 못 해 바로 return
    • EBADF : fd가 유효하지 않은 file descriptor
    • EFAULT : buf가 access할 수 없는 영역의 데이터다.
    • EINTR : signal이 발생해 interrupt 됨
    • EINVAL : fd, buf, cnt 등의 변수가 잘못 설정된 경우
    • EIO : I/O 오류
    • EISDIR : open된 fd가 directory인 경우
  • 여러번 호출시 파일을 이어서 읽어온다. 그럼 읽은만큼 파일의 커서가 이동하는 것일까?
    • 파일을 열면 읽어올 위치를 나타내는 오프셋이 파일의 시작을 가리키지만, read함수를 실행할 때마다 읽어온 크기만큼 오프셋이 이동해 다음 읽어올 위치를 가리킨다. 무조건 바이트 단위로 읽는다.
      참고 : https://jihooyim1.gitbooks.io/unixbasic/content/contents/02.html

 

write

파일을 읽는 함수

size_t write(int fd, const void *buf, size_t nbytes)

헤더파일 : <unistd.h>

fd : 파일 식별자

buf : 데이터를 저장하고 있는 버퍼

nbytes : 작성할 데이터의 byte 수

return

  • 성공 : 파일에 쓴 바이트 수
  • 실패 : -1

 

lseek

파일 디스크립터에서 연결된 파일의 오프셋을 특정 값으로 지정할 수 있게 해주는 시스템콜

off_f lseek(int fd, off_t offset, int origin)
  • off_t : size_t 처럼 <sys/types.h>에 정의된 시스템 자료형
  • fd : file descriptor
  • offset : 얼마큰 움직일지에 대한 정수값
  • origin : lseek()의 동작 방식
    • SEEK_CUR : 파일 오프셋이 파일의 맨 처음에 위치
      -> 최종적으로 맨 처음 위치에서 offset 만큼  뒤로 이동한 위치에 커서가 놓인다.
    • SEEK_END : 파일 오프셋을 현재 파일의 끝에 위치
      -> 최종적으로 맨 끝 위치에서 앞으로 offset 만큼 이동한 위치에 커서가 놓인다.
    • SEEK_SET : 파일 오프셋을 offset 값으로 설정

 

'42SEOUL' 카테고리의 다른 글

[C / get_next_line] 정적 변수 (static variable)  (0) 2022.03.16
[C / Libft] 컴파일 과정  (0) 2022.03.09
[C] LIBFT 정리  (0) 2022.02.13
[C / Libft] Makefile 만들기  (0) 2022.01.21
[C] NULL 포인터  (0) 2022.01.21