System Call : open → <fcntl.h> / read,write → <unistd.h> 필요
| 종류 | 함수 | 파라미터 | 설명 | 반환값 | |
|---|---|---|---|---|---|
| System Call | int open(const char *filename, int flags, mode_t pmode) |
filename: 파일 이름flags: 열기 모드pmode: 권한 설정 (선택적) |
파일 열기 | 성공: **정수형 fd (≥ 0)**실패: -1 | |
ssize_t read(int fd, void *buf, size_t size) |
fd: 파일 디스크립터buf: 데이터를 저장할 버퍼size: 읽을 바이트 수 |
파일에서 데이터 읽기 | 성공: 읽은 바이트 수파일 끝: 0실패: -1 | ||
ssize_t write(int fd, const void *buf, size_t size) |
fd: 파일 디스크립터buf: 쓸 데이터가 담긴 버퍼size: 쓸 바이트 수 |
파일에 데이터 쓰기 | 성공: 쓴 바이트 수실패: -1 | ||
int close(int fd) |
fd: 파일 디스크립터 |
파일 닫기 (버퍼 플러시 포함) | 성공: 0실패: -1 | ||
int lseek(int fd, off_t offset, int origin) |
fd: 파일 디스크립터 offset: 현위치에서 이동할 크기 origin: 현위치(상수) |
파일 위치 이동 | 성공: **이동된 위치 (바이트 단위)**실패: -1 | ||
| C Library | FILE *fopen(const char *filename, const char *mode) |
filename: 파일 이름mode: 열기 모드 ("r", "w" 등) |
파일 열기 | 성공: FILE*실패: NULL | |
size_t fread(void *ptr, size_t size, size_t count, FILE *stream) |
ptr: 저장할 메모리 버퍼size: 데이터 크기count: 읽을 개수stream: 파일 포인터 |
파일에서 데이터 읽기 | 실제 읽은 요소 수 (num 단위) | ||
size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream) |
ptr: 쓸 데이터 버퍼size: 데이터 크기count: 쓸 개수stream: 파일 포인터 |
파일에 데이터 쓰기 | 실제 쓴 요소 수 (num 단위) | ||
int fclose(FILE *stream) |
stream: 파일 포인터 |
파일 닫기 (버퍼 플러시 포함) | 성공: 0실패: EOF (보통 -1) | ||
int fseek(FILE * stream, long offset, int whence) |
stream: 파일 포인터 offset: 현위치에서 이동할 크기 whence: 현위치(상수) |
파일 위치 이동 | 성공: 0 실패: 비 0 값 | ||
long ftell(FILE * stream) |
stream: 파일 포인터 |
현재 파일 포인터가 가리키고 있는 위치를 반환함 | 성공: 현재 파일 포인터 위치 실패: -1 |
(※ System Call은 unistd.h, fcntl.h 헤더 포함 필요)
#include <fcntl.h> // open
#include <unistd.h> // read, write, close, lseek
#include <stdio.h> // printf
int main() {
int fd;
char buffer[20];
// 파일 열기 (없으면 생성)
fd = open("testfile.txt", O_RDWR | O_CREAT, 0644);
if (fd == -1) {
printf("open 실패\\n");
return 1;
}
// 파일에 쓰기
write(fd, "HelloWorld", 10); // 10바이트 쓰기
// 파일 포인터 위치 이동 (처음으로)
lseek(fd, 0, SEEK_SET);
// 파일에서 읽기
read(fd, buffer, 10);
buffer[10] = '\\0'; // 문자열 끝 처리
printf("읽은 내용: %s\\n", buffer);
// 파일 닫기
close(fd);
return 0;
}
실제 호출 예시 값 정리:
| 함수 | 예시 값 |
|---|---|
| open | `"testfile.txt", O_RDWR |
| write | fd, "HelloWorld", 10 |
| lseek | fd, 0, SEEK_SET |
| read | fd, buffer, 10 |
| close | fd |
(※ stdio.h 헤더 포함 필요)
#include <stdio.h>
int main() {
FILE *fp;
char buffer[20];
// 파일 열기
fp = fopen("testfile2.txt", "w+"); // 읽기/쓰기 모드
if (fp == NULL) {
printf("fopen 실패\\n");
return 1;
}
// 파일에 쓰기
fwrite("HelloCWorld", sizeof(char), 11, fp);
// 파일 포인터 위치 이동 (처음으로)
fseek(fp, 0, SEEK_SET);
// 파일에서 읽기
fread(buffer, sizeof(char), 11, fp);
buffer[11] = '\\0'; // 문자열 끝 처리
printf("읽은 내용: %s\\n", buffer);
// 현재 파일 위치 확인
long pos = ftell(fp);
printf("현재 파일 포인터 위치: %ld\\n", pos);
// 파일 닫기
fclose(fp);
return 0;
}
실제 호출 예시 값 정리:
| 함수 | 예시 값 |
|---|---|
| fopen | "testfile2.txt", "w+" |
| fwrite | "HelloCWorld", sizeof(char), 11, fp |
| fseek | fp, 0, SEEK_SET |
| fread | buffer, sizeof(char), 11, fp |
| ftell | fp |
| fclose | fp |
| 구분 | 예시 값 기억 포인트 |
|---|---|
| open / fopen | 파일명과 모드 |
| write / fwrite | "버퍼", 크기, 개수, 파일 |
| read / fread | 읽을 "버퍼", 크기, 개수, 파일 |
| lseek / fseek | 파일포인터, 오프셋(거리), 기준점(SEEK_SET 등) |
| ftell | 파일포인터 |
| close / fclose | 파일 디스크립터나 파일포인터 |