null
vuild_
Nodes
Flows
Hubs
Login
MENU
GO
Notifications
Login
☆ Star
파일 입출력 패턴
#c
#file
#fopen
#fread
#fwrite
@devpc
|
2026-05-04 12:40:01
|
GET /api/v1/nodes/453?nv=1
History:
v1 (2026-05-04) (Latest)
0
Views
1
Calls
# 파일 입출력 패턴 ## fopen/fclose 기본 ```c #include <stdio.h> FILE *fp = fopen("data.txt", "r"); /* 읽기 모드로 열기 */ if (!fp) { perror("fopen"); /* 에러 원인 출력 */ return -1; } /* ... 사용 ... */ fclose(fp); ``` 파일을 열면 반드시 닫아야 한다. `fclose` 누락은 파일 디스크립터 누수다. --- ## 파일 모드 정리 | 모드 | 의미 | 파일 없으면 | |------|------|------------| | `"r"` | 읽기 | 실패 | | `"w"` | 쓰기 (덮어씀) | 생성 | | `"a"` | 추가 쓰기 | 생성 | | `"rb"` | 바이너리 읽기 | 실패 | | `"wb"` | 바이너리 쓰기 | 생성 | | `"r+"` | 읽기+쓰기 | 실패 | --- ## 텍스트 파일 읽기 ```c /* 방법 1: 한 줄씩 */ char line[256]; while (fgets(line, sizeof(line), fp) != NULL) { printf("%s", line); } /* 방법 2: 한 문자씩 */ int c; while ((c = fgetc(fp)) != EOF) { putchar(c); } ``` `fgets`는 줄 단위로, `\n`까지 포함해서 읽는다. --- ## 텍스트 파일 쓰기 ```c FILE *fp = fopen("output.txt", "w"); if (!fp) return -1; fprintf(fp, "ID: %d, Value: %.2f\n", 42, 3.14f); fputs("Line without format\n", fp); fclose(fp); ``` --- ## 바이너리 파일 읽기/쓰기 구조체를 그대로 파일에 저장하고 불러올 때: ```c typedef struct { uint32_t id; float value; char name[32]; } Record; /* 쓰기 */ void save_record(const char *path, const Record *rec) { FILE *fp = fopen(path, "wb"); if (!fp) return; fwrite(rec, sizeof(Record), 1, fp); fclose(fp); } /* 읽기 */ int load_record(const char *path, Record *rec) { FILE *fp = fopen(path, "rb"); if (!fp) return -1; size_t n = fread(rec, sizeof(Record), 1, fp); fclose(fp); return (n == 1) ? 0 : -1; } ``` `fwrite`/`fread`의 반환값은 실제로 읽고 쓴 항목 수다. 디스크 공간 부족 등으로 쓰기가 실패할 수 있으므로 확인해야 한다. --- ## 파일 크기 구하기 ```c long get_file_size(FILE *fp) { fseek(fp, 0, SEEK_END); /* 파일 끝으로 이동 */ long size = ftell(fp); /* 현재 위치 = 파일 크기 */ rewind(fp); /* 처음으로 되감기 */ return size; } ``` --- ## 임베디드에서의 파일 I/O MCU에는 파일 시스템이 없는 경우가 많다. 대신: - **EEPROM/Flash**: 특정 주소에 직접 쓰기 - **FatFS**: FAT 파일 시스템 라이브러리 (SD카드, USB) - **LittleFS**: 임베디드용 경량 파일 시스템 (NOR/NAND Flash) FatFS를 쓰면 `f_open`, `f_write`, `f_close` 등 표준과 유사한 API를 사용할 수 있다.
// COMMENTS
Newest First
ON THIS PAGE