산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> C 언어

C 입출력(I/O) 마스터: 표준 스트림, 문자/행/포맷 입출력 함수 총정리

C의 입출력은 스트림(Stream) 추상화를 통해 파일, 콘솔, 네트워크 등을 통일된 방식으로 다룹니다. 표준 스트림과 주요 I/O 함수를 체계적으로 정리합니다.

표준 스트림 (자동 오픈)

stdout은 줄 버퍼링(개행 시 플러시), stderr는 무버퍼링(즉시 출력)됨.

문자 단위 입출력

스트림파일 포인터기본 장치용도
표준 입력stdin키보드데이터 읽기
표준 출력stdout화면일반 출력
표준 에러stderr화면에러/진단 메시지

예제: 문자 카운트

int ch, count = 0;
while ((ch = getchar()) != EOF) {
    if (ch != '\n') count++;
    putchar(ch);  // 에코
}
printf("문자 수: %d\n", count);

행 단위 입출력

함수원형설명
getcharint getchar(void)stdin에서 문자 1개 읽기, EOF(-1) 반환 가능
putcharint putchar(int c)stdout에 문자 1개 쓰기
fgetcint fgetc(FILE *stream)지정 스트림에서 문자 읽기
fputcint fputc(int c, FILE *stream)지정 스트림에 문자 쓰기
getc/putc매크로 버전 (인자 평가 부작용 주의)동작 동일, 인라인 가능
ungetcint ungetc(int c, FILE *stream)문자 1개 스트림에 되돌리기 (1회 보장)

fgets 안전한 입력 패턴

char buf[100];
if (fgets(buf, sizeof(buf), stdin)) {
    // 개행 제거
    buf[strcspn(buf, "\n")] = '\0';
    printf("입력: %s\n", buf);
}

포맷 입출력 (scanf/printf 계열)

printf 형식 지정자

함수원형설명
getschar *gets(char *s)위험/제거됨(C11), 버퍼 오버플로 불가피
fgetschar *fgets(char *s, int n, FILE *stream)최대 n-1자 또는 개행까지 읽기, 널 종결, 개행 포함
putsint puts(const char *s)문자열 + 개행 출력
fputsint fputs(const char *s, FILE *stream)문자열 출력 (개행 안 함)
지정자타입예시 출력
%d, %iint42
%uunsigned int42
%ld, %lulong, unsigned long42
%lld, %llulong long42
%zd, %zusize_t, ptrdiff_t42
%f, %lfdouble (printf에서 동일)3.140000
%e, %E지수 표기3.140000e+00
%g, %G자동 선택 (%f/%e)3.14
%cint (문자)A
%schar *hello
%pvoid *0x7ffc1234
%%%%

플래그, 폭, 정밀도

%[플래그][폭][.정밀도][길이]지정자

%-10d    // 왼쪽 정렬, 폭 10
%05d     // 0 채우기, 폭 5
%+d      // 부호 항상 표시
% d      // 양수 시 공백
%#x      // 0x 접두사
%.2f     // 소수점 2자리
%10.2f   // 폭 10, 소수점 2자리
%*.*f    // 폭/정밀도 인자로 전달

scanf 형식 지정자 (printf와 다름 주의!)

지정자타입인자
%dintint *
%uunsigned intunsigned int *
%ldlonglong *
%lldlong longlong long *
%ffloatfloat *
%lfdoubledouble *
%Lflong doublelong double *
%ccharchar *
%s문자열 (공백 전까지)char * (버퍼)
%[...]스캔셋 (문자 클래스)char *
%p포인터void **
%n읽은 문자 수int *

scanf 주의사항

int a, b;
if (scanf("%d %d", &a, &b) != 2) {
    // 입력 오류 처리
}

파일 입출력 (FILE 스트림)

파일 열기/닫기

FILE *fp = fopen("data.txt", "r");  // 읽기
FILE *fp = fopen("out.txt", "w");   // 쓰기 (생성/잘림)
FILE *fp = fopen("log.txt", "a");   // 추가
FILE *fp = fopen("data.bin", "rb"); // 바이너리 읽기

if (!fp) {
    perror("파일 열기 실패");
    return 1;
}

// 사용 후
fclose(fp);  // 버퍼 플러시 후 닫기, 실패 시 EOF 반환

파일 모드 문자열

파일 입출력 함수

모드설명바이너리
r읽기 (파일 존재해야)rb
w쓰기 (생성/잘림)wb
a추가 (생성/끝에서)ab
r+읽기/쓰기 (파일 존재)rb+, r+b
w+읽기/쓰기 (생성/잘림)wb+, w+b
a+읽기/추가 (생성/끝에서)ab+, a+b

블록 I/O (바이너리 데이터)

struct Record { int id; double value; };

// 쓰기
struct Record rec = {1, 3.14};
fwrite(&rec, sizeof(rec), 1, fp);

// 읽기
struct Record rec;
size_t count = fread(&rec, sizeof(rec), 1, fp);
if (count == 1) { ... }

모범 사례

C 언어

  1. C# 키워드와 식별자 이해: 규칙, 목록, 모범 사례
  2. C# 기초: 입출력(Essential Input/Output) 완벽 가이드
  3. C# 클래스와 객체: 견고한 OOP를 위한 기초 다지기
  4. C++ 입출력 마스터하기: cin, cout 실전 가이드
  5. C 입출력(I/O) 마스터: scanf()와 printf() 완전 정복
  6. 파이썬 입출력과 모듈 임포트 마스터하기: 실전 가이드
  7. Java 입출력 마스터: 출력, 입력, 포맷팅 완벽 가이드
  8. C++ 스트림 마스터: cout, cin, cerr, clog 실전 가이드
  9. C 상수와 리터럴: 정수, 실수, 문자, 문자열, 심볼릭 상수 정의법
  10. C# 상수 & 리터럴 마스터하기: 타입, 규칙, 모범 사례
기능텍스트바이너리
문자fgetc, fputc동일
행fgets, fputs-
포맷fscanf, fprintf-
블록-fread, fwrite
위치ftell, fseek, rewind동일
상태feof, ferror, clearerr동일