C++ I/O 및 파일 조작 - 3. 파일 입출력 기본 (Basic File I/O)

2025. 3. 30. 00:35프로그래밍 언어/C++

 

📘 3. 파일 입출력 기본 (Basic File I/O)

C++에서는 텍스트나 바이너리 파일을 다루기 위해 <fstream> 헤더를 사용합니다.
파일 입출력은 표준 입출력과 유사하게 스트림 기반으로 작동하며, 데이터를 영구 저장하거나 불러오는 데 적합합니다.


✅ <fstream> 헤더 소개

#include <fstream>

이 헤더는 파일 입출력을 위한 세 가지 주요 클래스를 제공합니다:

클래스 이름 설명 사용 목적
ifstream 입력 파일 스트림 파일에서 읽기
ofstream 출력 파일 스트림 파일에 쓰기
fstream 입출력 모두 지원하는 파일 스트림 읽기 + 쓰기 가능

✅ 예제: 텍스트 파일 읽기

#include <iostream>
#include <fstream>
#include <string>

int main() {
    std::ifstream fin("data.txt");
    std::string line;

    if (!fin) {
        std::cerr << "파일을 열 수 없습니다." << std::endl;
        return 1;
    }

    while (std::getline(fin, line)) {
        std::cout << line << std::endl;
    }

    fin.close();
    return 0;
}

✅ 예제: 텍스트 파일 쓰기

#include <iostream>
#include <fstream>

int main() {
    std::ofstream fout("output.txt");

    if (!fout) {
        std::cerr << "파일을 열 수 없습니다." << std::endl;
        return 1;
    }

    fout << "Hello, file!" << std::endl;
    fout << "이 내용이 파일에 저장됩니다." << std::endl;

    fout.close();
    return 0;
}

✅ 파일 열기 모드 (File Open Modes)

모드 설명
ios::in 읽기 모드 (기본: ifstream)
ios::out 쓰기 모드 (기본: ofstream)
ios::app 파일 끝에 내용을 추가 (append)
ios::binary 바이너리 모드 (텍스트가 아닌 데이터)
ios::trunc 열 때 기존 내용 삭제 (기본: ofstream)
ios::ate 파일을 열자마자 파일 끝으로 이동
std::ofstream fout("log.txt", std::ios::app);
std::fstream file("data.txt", std::ios::in | std::ios::out);

✅ 텍스트 모드 vs 바이너리 모드

C++ 파일 입출력은 기본적으로 텍스트 모드에서 작동합니다. 하지만 바이너리 데이터를 다룰 때는 ios::binary 모드를 명시해야 합니다.

구분 텍스트 모드 바이너리 모드
데이터 처리 사람이 읽을 수 있는 형식 그대로의 이진 데이터
개행 문자 변환 OS에 따라 자동 변환됨 (예: \n → \r\n) 변환 없이 그대로 저장됨
용도 로그, 설정파일 등 이미지, 오디오, 구조체 등 이진 파일

✅ 운영체제별 개행 문자 처리

운영체제에 따라 개행 문자 처리 방식이 다릅니다. C++의 텍스트 모드는 이를 자동으로 처리해 줍니다.

운영체제 개행 문자 설명
Windows \r\n (CR+LF) 캐리지 리턴 + 라인 피드
Unix/Linux/macOS \n (LF) 라인 피드

📌 주의사항: 바이너리 모드에서는 개행 문자 자동 변환이 일어나지 않으므로, 텍스트 파일을 바이너리로 잘못 저장하거나 읽으면 데이터 해석이 깨질 수 있습니다.


✅ fstream을 활용한 읽기 + 쓰기 예제

fstream 클래스는 하나의 스트림 객체로 파일을 읽기와 쓰기 모두 처리할 수 있게 해줍니다.

#include <iostream>
#include <fstream>
#include <string>

int main() {
    std::fstream file("example.txt", std::ios::in | std::ios::out | std::ios::trunc);

    if (!file) {
        std::cerr << "파일 열기에 실패했습니다." << std::endl;
        return 1;
    }

    // 파일에 쓰기
    file << "C++ 파일 입출력 테스트입니다." << std::endl;

    // 파일 읽기를 위해 위치 재조정
    file.seekg(0);  // 파일 처음으로 이동

    std::string line;
    std::getline(file, line);

    std::cout << "읽은 내용: " << line << std::endl;

    file.close();
    return 0;
}

📌 설명

  • std::ios::trunc: 기존 내용을 지우고 새로 작성
  • seekg(0): 읽기 위치를 파일의 처음으로 이동