기본 흐름
cpp
#include <iostream>
#include <string>
std::cout << "값: " << 42 << "\n"; // 출력
std::cerr << "에러 발생\n"; // 에러 출력 (버퍼 없음)
int n;
std::cin >> n; // 정수 입력
std::string line;
std::getline(std::cin, line); // 줄 전체 입력문법
cout·cerr·clog — 세 출력 스트림의 차이
cout은 버퍼링된 표준 출력입니다. 버퍼가 가득 차거나 flush/endl이 호출될 때 실제로 출력됩니다. cerr는 버퍼 없이 즉시 출력하므로 에러 메시지에 적합합니다. clog는 버퍼링된 에러 출력입니다.
cpp
std::cout << "일반 출력\n"; // 버퍼링 — '\n'은 flush 아님
std::cout << "flush" << std::endl; // std::endl = '\n' + flush (느림)
std::cout << "flush" << '\n' << std::flush; // 동일, 명시적
std::cerr << "에러: " << e.what() << "\n"; // 즉시 출력, 버퍼 없음>> 연산자의 버퍼 잔류 문제
cin >> 는 공백(스페이스, 탭, \n)을 건너뛰고 값을 읽은 후 \n을 버퍼에 남깁니다. 이후 getline을 바로 호출하면 버퍼에 남은 \n만 읽어 빈 문자열이 됩니다.
cpp
int n;
std::cin >> n; // 입력: "42\n" → n=42, '\n'이 버퍼에 남음
std::string line;
std::getline(std::cin, line); // ❌ '\n'만 읽어 line = "" (빈 문자열)
// ✅ >> 후 getline 전에 버퍼 비우기
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::getline(std::cin, line); // ✅ 이제 정상 입력출력 포맷 — iomanip
출력 형식을 제어하는 조작자(manipulator)를 <iomanip>에서 제공합니다.
cpp
#include <iomanip>
double pi = 3.14159265;
// 소수점 자리수
std::cout << std::fixed << std::setprecision(2) << pi << "\n"; // 3.14
std::cout << std::scientific << pi << "\n"; // 3.14e+00
// 폭과 정렬
std::cout << std::setw(10) << std::right << 42 << "\n"; // " 42"
std::cout << std::setw(10) << std::left << 42 << "\n"; // "42 "
std::cout << std::setfill('0') << std::setw(6) << 42 << "\n"; // "000042"진수·논리값 조작자
cpp
int n = 255;
// 진수 변환 (상태 변경 — 이후 출력에 계속 적용)
std::cout << std::hex << n << "\n"; // ff (16진수)
std::cout << std::oct << n << "\n"; // 377 (8진수)
std::cout << std::dec << n << "\n"; // 255 (10진수로 복원)
// 접두사 표시
std::cout << std::showbase;
std::cout << std::hex << n << "\n"; // 0xff
std::cout << std::oct << n << "\n"; // 0377
std::cout << std::dec; // 10진수 복원
// 불리언 출력
bool flag = true;
std::cout << flag << "\n"; // 1 (기본)
std::cout << std::boolalpha << flag << "\n"; // true
std::cout << std::noboolalpha << flag << "\n"; // 1 (복원)체크포인트
| 상황 | 적합한 선택 |
|---|---|
| 일반 출력 | std::cout << value |
| 에러 메시지 (즉시) | std::cerr << msg |
| 한 줄 전체 읽기 | std::getline(cin, line) |
>> 후 getline | cin.ignore(...) 먼저 |
| 소수점 자리수 | fixed << setprecision(n) |
| 출력 폭·정렬 | setw(n) << left/right |
| 16진수 출력 | hex (복원: dec) |
| 8진수 출력 | oct (복원: dec) |
접두사 표시 (0x, 0) | showbase |
| 불리언 true/false 출력 | boolalpha (복원: noboolalpha) |
주의할 점
std::endl은 '\n' + flush입니다. 루프 안에서 endl을 쓰면 매 반복마다 버퍼를 비워 성능이 저하됩니다.
cpp
// ❌ 매 반복마다 flush — 느림
for (int i = 0; i < 10000; ++i)
std::cout << i << std::endl;
// ✅ '\n'만 사용 (버퍼링 유지)
for (int i = 0; i < 10000; ++i)
std::cout << i << '\n';
// 마지막에 필요하면 한 번만 flush
std::cout << std::flush;참고 링크
1 sources