std::stdin / stdout / stderr

std::stdin / stdout / stderr (C 표준 스트림)

C 표준 라이브러리에서 미리 정의된 세 개의 표준 텍스트 스트림 매크로예요. stdin(표준 입력), stdout(표준 출력), stderr(표준 오류)로, 프로그램 시작 시 암시적으로 열리고 방향이 정해지지 않아요(unoriented).

출처: cppreference

본문

<cstdio> 헤더에 정의된 세 개의 텍스트 스트림이 미리 정의돼 있어요. 이 스트림들은 프로그램 시작 시 암시적으로 열리고 방향이 정해지지 않아요.

#define stdin  /* implementation-defined */   // (1)
#define stdout /* implementation-defined */   // (2)
#define stderr /* implementation-defined */   // (3)
  • (1) 표준 입력 스트림에 연관되며, 일반적인 입력을 읽는 데 사용돼요. 프로그램 시작 시, 그 스트림이 대화형 장치(interactive device)를 가리키지 않는다고 판단할 수 있을 때에만 완전 버퍼링(full buffering)돼요.
  • (2) 표준 출력 스트림에 연관되며, 일반적인 출력을 쓰는 데 사용돼요. 프로그램 시작 시, 그 스트림이 대화형 장치를 가리키지 않는다고 판단할 수 있을 때에만 완전 버퍼링돼요.
  • (3) 표준 오류 스트림에 연관되며, 진단 출력을 쓰는 데 사용돼요. 프로그램 시작 시 완전 버퍼링되지 않아요.

무엇이 대화형 장치인지는 구현 정의예요. 이 매크로들은 std::FILE* 타입의 표현식으로 확장돼요.

참고

POSIX가 요구하는 것은 아니지만, UNIX 관례는 stdin·stdout이 터미널에 연관되면 라인 버퍼링(line-buffered)되고 stderr는 버퍼링되지 않는 것이에요.

이 매크로들은 수정 가능한 lvalue로 확장될 수 있어요. 이런 std::FILE* lvalue 중 하나가 수정되면, 해당 스트림에 대한 이후 연산은 불특정 또는 정의되지 않은 동작을 일으켜요.

예제

이 예제는 std::printf와 유사한 함수를 보여줘요.

#include <concepts>
#include <cstdio>
#include <type_traits>

template<typename T>
concept IsPrintable = std::integral<T> or std::floating_point<T> or std::is_pointer_v<T>;

int my_printf(char const* const format, IsPrintable auto const ... arguments)
{
    return std::fprintf(stdout, format, arguments...);
}

int main(int argv, char*[])
{
    my_printf("Strings and chars:\t%s %c\n", "hello", 'x');
    my_printf("Rounding:\t\t%f %.0f %.32f\n", 1.5, 1.5, 1.3);
    my_printf("Padding:\t\t%05.2f %.2f %5.2f\n", 1.5, 1.5, 1.5);
    my_printf("Scientific:\t\t%E %e\n", 1.5, 1.5);
    my_printf("Hexadecimal:\t\t%a %A 0x%X\n", 1.5, 1.5, &argv);
}

가능한 출력:

Strings and chars:  hello x
Rounding:           1.500000 2 1.30000000000000004440892098500626
Padding:            01.50 1.50  1.50
Scientific:         1.500000E+00 1.500000e+00
Hexadecimal:        0x1.8p+0 0X1.8P+0 0x2CFB41BC

stdoutfprintf로 출력하는 걸 보여주며, %f, %e, %a 같은 형식 지정자를 활용해요.

더 알아보기 (Learn more)

cppreference