프로그램이 사용자와만 상호작용하는 게 아니라, 데이터를 파일로 저장하거나 파일에서 불러오는 기능이 필요할 때가 많다.
C언어에서는 표준 라이브러리를 이용해 파일을 읽고 쓰는 기능을 사용할 수 있다.
임베디드 환경에서는 거의 사용할 일은 없다. 이런 기능이 있다 정도로만 기억해둬도 좋다. 일반적인 프로그램은 Python으로 개발하는 것이 훨씬 효율적이다.
C언어에서 파일을 다루기 위해서는 FILE이라는 구조체를 가리키는 포인터(FILE *)를 사용한다.
이 포인터는 fopen() 함수로 초기화되며, 이후 파일 작업에 쓰인다.
FILE *fp;
파일을 열기 위해서는 fopen() 함수를 사용하며, 두 가지 인자가 필요하다:
fp = fopen("data.txt", "w");
모드 | 의미 |
---|---|
"r" | 읽기 전용 (파일이 존재해야 함) |
"w" | 쓰기 전용 (기존 파일 삭제됨) |
"a" | 추가 쓰기 (파일 끝에 덧붙임) |
"r+" | 읽기 + 쓰기 |
"w+" | 읽기 + 쓰기 (내용 초기화됨) |
FILE *fp = fopen("hello.txt", "w");
if (fp != NULL) {
fprintf(fp, "Hello, file!\n"); // 텍스트 작성
fclose(fp); // 파일 닫기
}
파일을 읽는 방법은 여러 가지가 있다.
FILE *fp = fopen("hello.txt", "r");
char buffer[100];
if (fp != NULL) {
fgets(buffer, 100, fp); // 한 줄 읽기
printf("읽은 내용: %s", buffer);
fclose(fp);
}
함수 | 설명 |
---|---|
"fscanf()" | 서식 지정해서 읽기 (scanf 와 유사) |
"fgets()" | 한 줄씩 읽기 (\n 까지 포함) |
"fgetc()" | 문자 하나씩 읽기 |
파일 작업이 끝나면 반드시 fclose()로 파일을 닫아야 한다.
파일을 닫지 않으면 데이터가 저장되지 않거나 메모리 누수
가 발생할 수 있다.
fclose(fp);
파일이 존재하는지 확인할 때는 fopen() 결과를 검사하면 된다.
FILE *fp = fopen("data.txt", "r");
if (fp == NULL) {
printf("파일이 존재하지 않습니다.\n");
} else {
printf("파일 열기 성공!\n");
fclose(fp);
}
파일 I/O는 실제 프로그램에서 다음과 같은 기능을 구현할 때 꼭 필요하다.
실습 경험이 쌓이면, 이 기능은 현실적인 문제 해결 능력과 직결된다.
fopen() 후 NULL 체크 안 하고 바로 사용 → 프로그램 뻗음
fclose() 빼먹음 → 데이터가 안 써짐
"w" 모드로 열었는데 기존 파일이 날아감 → 백업 필요
파일 입출력은 어렵지 않지만, 실수에 민감하다.
조금만 부주의해도 데이터가 날아갈 수 있으므로, 항상 에러 체크와 자원 정리를 습관화해야 한다.
@nullvuild