`fputc`, `putc` 함수

fputc, putc 함수 (fputc, putc)

문자를 하나씩 파일에 써야 할 때 쓰는 함수가 fputc예요. fgetc의 쓰기 버전이라고 보면 되죠. 거의 같은 일을 하는 putc라는 매크로도 있는데, fgetc/getc처럼 매크로의 특징 때문에 주의할 점이 있어요.

출처: cppreference

본문

함수 원형

<stdio.h>에 정의돼 있어요.

int fputc( int ch, FILE* stream );   // (1)
int putc ( int ch, FILE* stream );   // (2)

설명 (Explanation)

  1. 문자 ch를 주어진 출력 스트림 stream에 써요.
  2. fputc와 같지만, putc가 매크로로 구현되어 있다면 stream을 두 번 이상 평가할 수 있어요. 그래서 해당 인자로 부수 효과(side effect)가 있는 표현식은 쓰면 안 돼요.

내부적으로, 문자는 쓰이기 직전에 unsigned char로 변환돼요.

매개변수 (Parameters)

  • ch — 쓸 문자
  • stream — 출력 스트림

반환값 (Return value)

성공하면 쓴 문자를 돌려줘요.

실패하면 EOF를 돌려주고 stream에 오류 표시를 설정해요(ferror() 참고).

예제 (Example)

putc로 알파벳을 하나씩 stdout에 쓰되, 실패를 검사하는 예시예요.

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int ret_code = 0;
    for (char c = 'a'; (ret_code != EOF) && (c != 'z'); c++)
        ret_code = putc(c, stdout);
    // Test whether EOF was reached.
    if (ret_code == EOF && ferror(stdout))
    {
        perror("putc()");
        fprintf(stderr, "putc() failed in file %s at line # %d\n",
                __FILE__, __LINE__ - 7);
        exit(EXIT_FAILURE);
    }
    putc('\n', stdout);
    return EXIT_SUCCESS;
}

출력:

abcdefghijklmnopqrstuvwxy

보통은 putc가 매크로로 구현되기 때문에, 부수 효과가 있는 표현식을 stream에 넘기면 문제가 생길 수 있어요. 이 예시처럼 반환값을 검사하고 ferror까지 확인해 주면 안전해요.

같이 보기 (See also)

  • putchar — stdout에 문자 쓰기