C++ 초급 - 추가 내용 (심화 학습) (2 - 파일 입출력 (fstream))

2025. 2. 22. 18:32프로그래밍 언어/C++

📌 2. 파일 입출력 (fstream)

C++에서는 파일을 읽고 쓰기 위해 fstream 라이브러리를 사용한다.
이를 활용하면 텍스트 파일과 바이너리 파일을 다룰 수 있으며, 데이터 저장 및 로깅이 가능하다.


📌 2.1 파일 스트림 (std::ifstream, std::ofstream, std::fstream) 기본 사용법

C++의 파일 입출력은 세 가지 주요 클래스를 사용한다.

파일 스트림 클래스 설명
std::ifstream 파일을 읽기 모드로 염 (ifstream = input file stream)
std::ofstream 파일을 쓰기 모드로 염 (ofstream = output file stream)
std::fstream 읽기/쓰기 모두 가능 (fstream = file stream)

💡 예제: 파일 스트림 기본 사용법

#include <iostream>
#include <fstream>

int main() {
    std::ofstream outFile("example.txt");  // 파일 생성 및 열기 (쓰기 모드)
    outFile << "Hello, C++ File IO!" << std::endl;  // 파일에 쓰기
    outFile.close();  // 파일 닫기

    std::ifstream inFile("example.txt");  // 파일 열기 (읽기 모드)
    std::string line;
    std::getline(inFile, line);  // 파일에서 한 줄 읽기
    std::cout << "파일 내용: " << line << std::endl;
    inFile.close();  // 파일 닫기

    return 0;
}

🔹 출력 결과 (example.txt에 저장된 내용)

파일 내용: Hello, C++ File IO!

💡 설명

  • std::ofstream → 파일 생성 및 쓰기
  • std::ifstream → 파일 읽기
  • close()를 사용하여 파일 닫기 (자원 관리)

📌 2.2 텍스트 파일 읽기/쓰기 (open(), close(), getline())

텍스트 파일 입출력은 줄 단위(getline()), 단어 단위(>>), 문자 단위(get())로 읽을 수 있다.

🔹 (1) 텍스트 파일 쓰기 (std::ofstream)

💡 예제: 텍스트 파일 생성 및 데이터 쓰기

#include <iostream>
#include <fstream>

int main() {
    std::ofstream file("data.txt");  // 파일 열기 (쓰기 모드)
    
    if (!file) {
        std::cerr << "파일을 열 수 없습니다!" << std::endl;
        return 1;
    }

    file << "이것은 C++ 파일 입출력 예제입니다." << std::endl;
    file << "파일에 여러 줄을 쓸 수 있습니다." << std::endl;

    file.close();  // 파일 닫기
    return 0;
}

🔹 출력 결과 (data.txt 파일 내용)

이것은 C++ 파일 입출력 예제입니다.
파일에 여러 줄을 쓸 수 있습니다.

🔹 (2) 텍스트 파일 읽기 (std::ifstream)

💡 예제: 파일에서 한 줄씩 읽기 (getline())

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

int main() {
    std::ifstream file("data.txt");  // 파일 열기 (읽기 모드)

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

    std::string line;
    while (std::getline(file, line)) {  // 한 줄씩 읽기
        std::cout << line << std::endl;
    }

    file.close();
    return 0;
}

🔹 출력 결과

이것은 C++ 파일 입출력 예제입니다.
파일에 여러 줄을 쓸 수 있습니다.

💡 설명

  • std::getline(file, line) → 한 줄씩 읽음
  • 파일이 끝날 때까지 while 루프로 읽기 가능

📌 2.3 바이너리 파일 읽기/쓰기 (read(), write())

바이너리 파일은 텍스트 파일과 달리, 데이터를 read()와 write()로 직접 처리해야 한다.

🔹 (1) 바이너리 파일 쓰기 (std::ofstream)

💡 예제: 바이너리 파일에 데이터 저장

#include <iostream>
#include <fstream>

struct Data {
    int id;
    double value;
};

int main() {
    Data d = {1, 99.99};

    std::ofstream file("binary.dat", std::ios::binary);  // 바이너리 모드로 파일 열기
    file.write(reinterpret_cast<char*>(&d), sizeof(Data));
    file.close();

    return 0;
}

🔹 설명

  • std::ios::binary → 바이너리 모드로 파일 열기
  • write(reinterpret_cast<char*>(&d), sizeof(Data)) → 데이터를 바이너리로 저장

🔹 (2) 바이너리 파일 읽기 (std::ifstream)

💡 예제: 바이너리 파일에서 데이터 읽기

#include <iostream>
#include <fstream>

struct Data {
    int id;
    double value;
};

int main() {
    Data d;

    std::ifstream file("binary.dat", std::ios::binary);
    file.read(reinterpret_cast<char*>(&d), sizeof(Data));
    file.close();

    std::cout << "ID: " << d.id << ", Value: " << d.value << std::endl;
    return 0;
}

🔹 출력 결과

ID: 1, Value: 99.99

💡 설명

  • read(reinterpret_cast<char*>(&d), sizeof(Data)) → 바이너리 데이터 읽기

📌 2.4 파일 스트림의 예외 처리 (exceptions(), fail())

파일이 존재하지 않거나 권한이 없을 경우 예외 처리를 해야 한다.

💡 예제: 파일 스트림의 예외 처리 (fail(), exceptions())

#include <iostream>
#include <fstream>

int main() {
    std::ifstream file("nonexistent.txt");

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

    std::string content;
    file >> content;  // 읽기 시도

    if (file.fail()) {
        std::cerr << "파일 읽기 실패!" << std::endl;
    }

    return 0;
}

🔹 출력 결과 (파일이 없을 경우)

파일을 열 수 없습니다!

💡 설명

  • if (!file) → 파일이 존재하는지 확인
  • file.fail() → 읽기 실패 여부 확인

📌 2.5 파일을 활용한 데이터 저장 및 로깅 구현

💡 예제: 로그 파일 작성 (log.txt에 저장)

#include <iostream>
#include <fstream>
#include <ctime>

void logMessage(const std::string& message) {
    std::ofstream logFile("log.txt", std::ios::app);  // 기존 파일에 추가 (append 모드)
    
    if (!logFile) {
        std::cerr << "로그 파일을 열 수 없습니다!" << std::endl;
        return;
    }

    std::time_t now = std::time(nullptr);
    logFile << std::ctime(&now) << " - " << message << std::endl;
}

int main() {
    logMessage("프로그램 시작");
    logMessage("데이터 처리 중...");
    logMessage("프로그램 종료");

    return 0;
}

🔹 출력 결과 (log.txt 파일)

Mon Feb 12 14:30:45 2024 - 프로그램 시작
Mon Feb 12 14:30:46 2024 - 데이터 처리 중...
Mon Feb 12 14:30:47 2024 - 프로그램 종료

📌 3. 정리

기능  설명
텍스트 파일 입출력 std::ifstream, std::ofstream, std::getline() 활용
바이너리 파일 입출력 read(), write(), reinterpret_cast 활용
파일 예외 처리 fail(), exceptions()를 활용한 에러 처리
로그 시스템 파일을 활용한 데이터 저장 및 로깅 구현