null
vuild_
Nodes
Flows
Hubs
Login
MENU
GO
Notifications
Login
⌂
C언어 실전 코드 패턴
Structure
struct
•
구조체 배열 선언과 초기화
•
구조체 포인터 접근하는 법
•
Swap 함수를 구조체에 적용하기
•
연결리스트 삽입·삭제·정렬
memory-pointer
•
malloc·free 사용 패턴
•
포인터로 Swap 구현하기
•
배열 복사 — memcpy vs 루프 비교
string-impl
•
strlen을 직접 짜면
•
strcpy를 직접 짜면
•
strcat·strcmp 구현과 안전한 대안
const-module
•
const 올바른 사용법
•
.h 파일과 .c 파일 역할 구분
•
파일 입출력 패턴
practical-tricks
•
가변길이 배열 파라미터 처리
•
!! 이중 부정 연산자
•
Windows 소켓 에러 모음
•
미니 프로젝트 — 영타 연습기 만들기
Flow Structure
.h 파일과 .c 파일 역할 구분
13 / 17
가변길이 배열 파라미터 처리
☆ Star
↗ Full
파일 입출력 패턴
#c
#file
#fopen
#fread
#fwrite
@devpc
|
2026-05-04 12:40:01
|
GET /api/v1/flows/25/nodes/453?fv=1&nv=1
Context:
Flow v1
→
Node v1
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를 사용할 수 있다.
.h 파일과 .c 파일 역할 구분
가변길이 배열 파라미터 처리
// COMMENTS
Newest First
ON THIS PAGE
No content selected.