Core Programming/C Standard Library: Resource & Performan

C언어 파일 입출력 정복: fputs, fgets 함수 완벽 가이드 (예제 포함)

임베디드 친구 2025. 2. 4. 08:58
반응형

C언어에서 문자열을 파일에 저장하거나 화면에 출력할 때, 가장 안정적이고 유연하게 사용할 수 있는 함수가 바로 fputs와 fgets입니다. 특히 사용자로부터 입력을 받을 때 scanf의 고질적인 문제인 공백 입력과 버퍼 오버플로우를 해결할 수 있는 훌륭한 대안이기도 합니다.

오늘은 fputs와 fgets의 동작 방식부터 파일 입출력 실습까지 상세히 알아보겠습니다.

Generated by Gemini AI.


1. fputs 함수: 스트림으로 문자열 출력

fputs 함수는 지정된 출력 스트림(파일 또는 표준 출력)으로 문자열을 내보내는 역할을 합니다.

1.1 fputs의 특징

  • 자동 개행 없음: puts와 달리 문자열 끝에 줄바꿈(\n)을 자동으로 추가하지 않습니다.
  • 서식 지정 불가: printf처럼 %d 등을 사용할 수 없지만, 속도가 빠르고 가볍습니다.

1.2 함수 프로토타입 및 예제

C
 
#include <stdio.h>
int fputs(const char *str, FILE *stream);

실전 파일 쓰기 예제:

C
 
#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "w");
    if (file == NULL) {
        perror("파일 열기 실패");
        return 1;
    }

    fputs("Hello, World!\n", file); // \n을 직접 넣어줘야 줄바꿈이 됩니다.
    fputs("C언어 fputs 함수 사용법 학습 중.", file);

    fclose(file);
    return 0;
}

2. fgets 함수: 안전하게 문자열 읽기

fgets 함수는 입력 스트림에서 문자열을 읽어올 때 사용합니다. scanf("%s")와 달리 공백을 포함한 한 줄을 통째로 읽을 수 있다는 큰 장점이 있습니다.

2.1 fgets가 안전한 이유

  • 버퍼 오버플로우 방지: 읽어올 최대 길이를 지정하기 때문에 설정한 버퍼 크기를 넘어서는 입력을 원천 차단합니다.
  • 공백 처리: 스페이스바나 탭이 포함된 문자열도 개행 문자(\n)를 만날 때까지 모두 읽어들입니다.

2.2 함수 프로토타입 및 예제

C
 
#include <stdio.h>
char *fgets(char *str, int size, FILE *stream);

표준 입력(stdin) 예제:

C
 
#include <stdio.h>

int main() {
    char buffer[100];

    printf("문장이나 이름을 입력하세요: ");
    // sizeof(buffer)를 통해 안전하게 입력을 제한합니다.
    if (fgets(buffer, sizeof(buffer), stdin) != NULL) {
        printf("입력 결과: %s", buffer);
    }

    return 0;
}

3. 종합 실습: 파일 읽고 쓰기 시나리오

이제 fputs로 데이터를 기록하고, fgets를 이용해 파일 내용을 한 줄씩 읽어오는 완성된 코드를 살펴보겠습니다.

C
 
#include <stdio.h>

int main() {
    // 1. 파일 쓰기 모드
    FILE *file = fopen("sample.txt", "w");
    if (!file) return 1;

    fputs("첫 번째 줄입니다.\n", file);
    fputs("두 번째 줄입니다.\n", file);
    fclose(file);

    // 2. 파일 읽기 모드
    file = fopen("sample.txt", "r");
    if (!file) return 1;

    char buffer[100];
    printf("--- 파일 내용 출력 ---\n");
    while (fgets(buffer, sizeof(buffer), file) != NULL) {
        printf("%s", buffer); // fgets가 포함한 \n 덕분에 줄바꿈이 유지됩니다.
    }

    fclose(file);
    return 0;
}

4. [중요] 실무 사용 시 주의사항 및 팁

① fputs와 puts의 결정적 차이

함수 줄바꿈(\n) 자동 추가 출력 대상 지정
puts YES 표준 출력(stdout) 고정
fputs NO 파일 포인터 또는 stdout 선택 가능

② fgets의 줄바꿈 문자 제거 팁

fgets는 사용자가 엔터를 치면 개행 문자(\n)까지 버퍼에 저장합니다. 문자열 비교나 가공을 위해 이를 제거하려면 다음 코드를 활용하세요.

C
 
#include <string.h>
buffer[strcspn(buffer, "\n")] = '\0'; // 개행 문자를 찾아 NULL 문자로 변경

결론

fputs와 fgets는 C 언어 프로그래밍에서 데이터의 흐름(Stream)을 안정적으로 제어하는 필수 도구입니다. 특히 입력 시 크기를 제한할 수 있는 fgets는 보안 코딩의 기본이므로 반드시 익혀두시기 바랍니다.

오늘 배운 내용을 바탕으로 텍스트 기반의 데이터베이스나 간단한 로그 기록 시스템을 구현해 보시는 것을 추천드립니다!


포스팅이 도움이 되셨다면 하트(♥)와 댓글 부탁드립니다!

임베디드 소프트웨어 및 최적화 기법에 대한 전문적인 정보는 'Coding by Head' 블로그에서 계속됩니다.

https://coding-by-head.tistory.com/

반응형