nullvuild

Bloger @nullvuild

Created Date '2025/03/24 오후 02:28

Modified Date '2025/03/24 오후 02:28

#C언어 #파일 입출력 #FILE

프로그램이 사용자와만 상호작용하는 게 아니라, 데이터를 파일로 저장하거나 파일에서 불러오는 기능이 필요할 때가 많다.

C언어에서는 표준 라이브러리를 이용해 파일을 읽고 쓰는 기능을 사용할 수 있다.


임베디드 환경에서는 거의 사용할 일은 없다. 이런 기능이 있다 정도로만 기억해둬도 좋다. 일반적인 프로그램은 Python으로 개발하는 것이 훨씬 효율적이다.

1. 파일 포인터: FILE *

C언어에서 파일을 다루기 위해서는 FILE이라는 구조체를 가리키는 포인터(FILE *)를 사용한다.

이 포인터는 fopen() 함수로 초기화되며, 이후 파일 작업에 쓰인다.


FILE *fp;

2. 파일 열기: fopen()

파일을 열기 위해서는 fopen() 함수를 사용하며, 두 가지 인자가 필요하다:

fp = fopen("data.txt", "w");

  • 첫 번째 인자: 파일 이름 (문자열)
  • 두 번째 인자: 모드 (열기 방식)

모드의미
"r"읽기 전용 (파일이 존재해야 함)
"w"쓰기 전용 (기존 파일 삭제됨)
"a"추가 쓰기 (파일 끝에 덧붙임)
"r+"읽기 + 쓰기
"w+"읽기 + 쓰기 (내용 초기화됨)

3. 파일 쓰기: fprintf() 또는 fputs()

FILE *fp = fopen("hello.txt", "w");
if (fp != NULL) {
    fprintf(fp, "Hello, file!\n");  // 텍스트 작성
    fclose(fp);  // 파일 닫기
}

  • fprintf()는 printf()처럼 형식을 지정해서 출력 가능
  • fputs()는 문자열만 출력할 때 사용


4. 파일 읽기: fscanf(), fgets(), fgetc()

파일을 읽는 방법은 여러 가지가 있다.


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()"문자 하나씩 읽기

5. 파일 닫기: fclose()

파일 작업이 끝나면 반드시 fclose()로 파일을 닫아야 한다.

파일을 닫지 않으면 데이터가 저장되지 않거나 메모리 누수가 발생할 수 있다.


fclose(fp);

6. 파일 존재 여부 확인 (보너스)

파일이 존재하는지 확인할 때는 fopen() 결과를 검사하면 된다.


FILE *fp = fopen("data.txt", "r");
if (fp == NULL) {
    printf("파일이 존재하지 않습니다.\n");
} else {
    printf("파일 열기 성공!\n");
    fclose(fp);
}

7. 파일 입출력은 왜 중요한가?


파일 I/O는 실제 프로그램에서 다음과 같은 기능을 구현할 때 꼭 필요하다.

  • 설정값 저장 및 불러오기
  • 로그 기록
  • 사용자 데이터 저장 (메모장, 게임 세이브 등)
  • CSV/텍스트 파일 분석기

실습 경험이 쌓이면, 이 기능은 현실적인 문제 해결 능력과 직결된다.



자주 하는 실수

fopen() 후 NULL 체크 안 하고 바로 사용 → 프로그램 뻗음

fclose() 빼먹음 → 데이터가 안 써짐

"w" 모드로 열었는데 기존 파일이 날아감 → 백업 필요


코멘트

파일 입출력은 어렵지 않지만, 실수에 민감하다.

조금만 부주의해도 데이터가 날아갈 수 있으므로, 항상 에러 체크와 자원 정리를 습관화해야 한다.

Nullvuild

Nullvuild

@nullvuild

프로필