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
stdout에 fprintf로 출력하는 걸 보여주며, %f, %e, %a 같은 형식 지정자를 활용해요.