파일의 종류
텍스트 파일 (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는 시스템콜이 열려있는 파일을 참조할 때 사용한다.
- file descriptor로 현재 열려있지 않은 가장 작은 값으로 배정된다.
- 실패 : -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
- 파일을 열면 읽어올 위치를 나타내는 오프셋이 파일의 시작을 가리키지만, read함수를 실행할 때마다 읽어온 크기만큼 오프셋이 이동해 다음 읽어올 위치를 가리킨다. 무조건 바이트 단위로 읽는다.
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 값으로 설정
- SEEK_CUR : 파일 오프셋이 파일의 맨 처음에 위치
'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 |