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

1. fputs 함수: 스트림으로 문자열 출력
fputs 함수는 지정된 출력 스트림(파일 또는 표준 출력)으로 문자열을 내보내는 역할을 합니다.
1.1 fputs의 특징
- 자동 개행 없음: puts와 달리 문자열 끝에 줄바꿈(\n)을 자동으로 추가하지 않습니다.
- 서식 지정 불가: printf처럼 %d 등을 사용할 수 없지만, 속도가 빠르고 가볍습니다.
1.2 함수 프로토타입 및 예제
#include <stdio.h>
int fputs(const char *str, FILE *stream);
실전 파일 쓰기 예제:
#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 함수 프로토타입 및 예제
#include <stdio.h>
char *fgets(char *str, int size, FILE *stream);
표준 입력(stdin) 예제:
#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를 이용해 파일 내용을 한 줄씩 읽어오는 완성된 코드를 살펴보겠습니다.
#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)까지 버퍼에 저장합니다. 문자열 비교나 가공을 위해 이를 제거하려면 다음 코드를 활용하세요.
#include <string.h>
buffer[strcspn(buffer, "\n")] = '\0'; // 개행 문자를 찾아 NULL 문자로 변경
결론
fputs와 fgets는 C 언어 프로그래밍에서 데이터의 흐름(Stream)을 안정적으로 제어하는 필수 도구입니다. 특히 입력 시 크기를 제한할 수 있는 fgets는 보안 코딩의 기본이므로 반드시 익혀두시기 바랍니다.
오늘 배운 내용을 바탕으로 텍스트 기반의 데이터베이스나 간단한 로그 기록 시스템을 구현해 보시는 것을 추천드립니다!
포스팅이 도움이 되셨다면 하트(♥)와 댓글 부탁드립니다!
임베디드 소프트웨어 및 최적화 기법에 대한 전문적인 정보는 'Coding by Head' 블로그에서 계속됩니다.
'Core Programming > C Standard Library: Resource & Performan' 카테고리의 다른 글
| C언어 파일 입출력 마스터: fprintf와 fscanf로 데이터 저장 및 읽기 완벽 가이드 (0) | 2025.02.06 |
|---|---|
| C언어 파일 입출력 완벽 가이드: fopen부터 fread, fwrite 바이너리 활용까지 (0) | 2025.02.05 |
| C언어 문자열 입출력 가이드: puts, gets 문제점과 fgets 완벽 대체법 (0) | 2025.02.03 |
| C언어 입출력 완전 정복: stdio.h printf scanf 서식 지정자 총정리 (0) | 2025.02.02 |
| C언어 표준 라이브러리 총정리: 주요 헤더 파일과 POSIX API 차이점 비교 (0) | 2025.02.02 |