Core Programming/Modern C++ & System Design

C++ 입출력 완벽 가이드: cin, cout부터 파일 입출력 및 소수점 제어까지

임베디드 친구 2024. 12. 17. 20:32
728x90
반응형

C++ 입출력 마스터: 콘솔 I/O부터 fstream 파일 제어까지

안녕하세요! Coding by Head입니다. C++ 프로그래밍의 시작은 사용자와 소통하는 '입출력'에서 시작됩니다. 오늘은 표준 입출력 라이브러리인 <iostream>의 핵심 사용법과 실무에서 자주 발생하는 문제들을 해결하는 방법을 정리해 보겠습니다.

Generated by Gemini AI.


1. C++ 표준 입출력 스트림 (Standard Streams)

C++은 스트림(Stream)이라는 개념을 통해 데이터를 주고받습니다. 데이터가 흐르는 통로라고 이해하면 쉽습니다.

  • std::cin: 표준 입력 (키보드)
  • std::cout: 표준 출력 (모니터)
  • std::cerr: 표준 에러 (버퍼를 거치지 않고 즉시 출력)
  • std::clog: 로그 출력 (버퍼링을 거치는 로그용)

2. 기본 출력과 형식 제어 (cout, iomanip)

cout은 << (삽입 연산자)를 사용해 데이터를 출력합니다. 이때 데이터의 모양을 예쁘게 만들기 위해 <iomanip> 라이브러리를 함께 사용합니다.

소수점 자릿수 조절 예제

C++
 
#include <iostream>
#include <iomanip> // 형식 제어용 헤더

int main() {
    double pi = 3.1415926535;

    std::cout << "기본 출력: " << pi << std::endl;
    
    // 소수점 고정 및 2자리까지 출력
    std::cout << std::fixed << std::setprecision(2);
    std::cout << "고정 소수점(2자리): " << pi << std::endl;

    return 0;
}

3. 입력의 함정: cin vs getline

많은 초보자가 std::cin을 사용하다가 공백(Space)이 포함된 문자열에서 입력을 멈추는 현상을 겪습니다.

  • std::cin >> var;: 공백이나 엔터를 기준으로 단어 하나만 읽습니다.
  • std::getline(std::cin, var);: 한 줄 전체(공백 포함)를 읽습니다.

실전 팁: 버퍼 비우기

cin 다음에 getline을 쓸 때는 버퍼에 남아있는 '엔터(\n)'를 제거해야 합니다. 이때 std::cin.ignore()를 사용하세요.

C++
 
std::cin >> age;
std::cin.ignore(); // 버퍼에 남은 엔터 제거
std::getline(std::cin, fullName);

4. 파일 입출력 (fstream)

로그 저장이나 데이터 로드를 위해 파일 제어는 필수입니다. <fstream> 헤더를 사용합니다.

파일 쓰기/읽기 통합 예제

C++
 
#include <iostream>
#include <fstream>
#include <string>

int main() {
    // 1. 파일 쓰기 (ofstream)
    std::ofstream outFile("data.txt");
    if (outFile.is_open()) {
        outFile << "Coding by Head - C++ 포스팅" << std::endl;
        outFile.close();
    }

    // 2. 파일 읽기 (ifstream)
    std::ifstream inFile("data.txt");
    std::string line;
    if (inFile.is_open()) {
        while (std::getline(inFile, line)) {
            std::cout << "파일 내용: " << line << std::endl;
        }
        inFile.close();
    }

    return 0;
}

💡 알고리즘 성능 최적화 (Fast I/O)

코딩 테스트나 대량의 데이터를 다룰 때 cout이 느리게 느껴진다면, 아래 코드를 main 함수 최상단에 추가하세요. C 표준 스트림과의 동기화를 끊어 속도를 획기적으로 높여줍니다.

C++
 
ios_base::sync_with_stdio(false);
cin.tie(NULL);

💡 std::endl vs \n

std::endl은 줄을 바꾸고 출력 버퍼를 강제로 비우는(flush) 작업을 수행합니다. 단순히 줄바꿈만 필요하다면 성능상 \n을 사용하는 것이 더 빠릅니다.


마치며

이번 포스팅에서는 C++ 입출력의 기초부터 실무 팁까지 다뤘습니다. 특히 공백 입력 처리출력 형식 제어는 매우 자주 쓰이는 기술이니 꼭 직접 코딩해 보시기 바랍니다.

다음 포스팅에서는 프로그램의 두뇌가 되는 연산자와 조건문에 대해 알아보겠습니다. 궁금하신 점은 댓글로 남겨주세요!

반응형