리눅스에서 파일 입출력은 데이터를 파일에 저장하거나 파일에서 읽어들이는 기능으로, 운영체제와 직접적으로 상호작용하는 중요한 작업입니다. 파일 입출력은 크게 저수준 파일 입출력과 고수준 파일 입출력으로 나뉩니다. 이번 글에서는 두 방식의 차이점과 사용법을 살펴보겠습니다.
unistd.h
및 fcntl.h
헤더 파일의 함수들을 사용합니다.open
파일을 열거나 새로 생성하는 함수입니다.
int open(const char *pathname, int flags, mode_t mode);
pathname
: 열고자 하는 파일의 경로.flags
: 파일 열기 모드(O_RDONLY
, O_WRONLY
, O_RDWR
등).mode
: 파일 생성 시 권한(선택적).read
파일에서 데이터를 읽어오는 함수입니다.
ssize_t read(int fd, void *buf, size_t count);
fd
: 파일 디스크립터.buf
: 읽어들인 데이터를 저장할 버퍼.count
: 읽을 바이트 크기.write
데이터를 파일에 쓰는 함수입니다.
ssize_t write(int fd, const void *buf, size_t count);
close
열린 파일을 닫는 함수입니다.
int close(int fd);
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main() {
int fd = open("example.txt", O_RDONLY); // 읽기 전용으로 파일 열기
if (fd == -1) {
perror("파일 열기 실패");
return 1;
}
char buffer[128];
ssize_t bytesRead = read(fd, buffer, sizeof(buffer) - 1); // 파일 읽기
if (bytesRead == -1) {
perror("파일 읽기 실패");
close(fd);
return 1;
}
buffer[bytesRead] = '\0'; // 문자열로 처리하기 위해 NULL 추가
printf("파일 내용: %s\n", buffer);
close(fd); // 파일 닫기
return 0;
}
stdio.h
헤더 파일의 함수를 사용합니다.fopen
파일을 열거나 새로 생성하는 함수입니다.
FILE *fopen(const char *pathname, const char *mode);
pathname
: 파일 경로.mode
: 파일 열기 모드("r"
, "w"
, "a"
등).fgets
파일에서 한 줄의 데이터를 읽어오는 함수입니다.
char *fgets(char *str, int n, FILE *stream);
fprintf
데이터를 파일에 쓰는 함수입니다.
int fprintf(FILE *stream, const char *format, ...);
fclose
열린 파일을 닫는 함수입니다.
int fclose(FILE *stream);
#include <stdio.h>
int main() {
FILE *fp = fopen("output.txt", "w"); // 쓰기 모드로 파일 열기
if (fp == NULL) {
perror("파일 열기 실패");
return 1;
}
fprintf(fp, "Hello, World!\n"); // 파일에 쓰기
fprintf(fp, "이것은 고수준 파일 입출력 예제입니다.\n");
fclose(fp); // 파일 닫기
return 0;
}
구분 | 저수준 파일 입출력 | 고수준 파일 입출력 |
---|---|---|
접근 방식 | 시스템 호출 사용 | C 표준 라이브러리 사용 |
함수 예시 | open , read , write | fopen , fgets , fprintf |
반환 값 | 파일 디스크립터(int) | 파일 포인터(FILE *) |
사용 용이성 | 복잡함 | 간단함 |
처리 속도 | 빠름 | 상대적으로 느림 |
리눅스 파일 입출력은 각각의 장점과 용도가 다릅니다.