프로그래밍/C++

C++ 파일 입출력: 파일 읽기와 쓰기

shimdh 2025. 2. 1. 14:00
728x90

파일 입출력의 중요성

파일 입출력은 프로그램이 외부 데이터와 상호작용하는 가장 기본적이면서도 필수적인 기능입니다. 프로그램이 실행되는 동안 메모리에 저장된 데이터는 프로그램이 종료되면 사라집니다. 그러나 파일 입출력을 사용하면 데이터를 영구적으로 저장하거나, 다른 프로그램과 데이터를 공유할 수 있습니다. 예를 들어, 다음과 같은 상황에서 파일 입출력이 유용합니다:

  1. 데이터 저장: 프로그램의 실행 결과를 파일로 저장하여 나중에 다시 사용할 수 있습니다.
  2. 데이터 로드: 이전에 저장한 데이터를 불러와 프로그램에서 활용할 수 있습니다.
  3. 로그 기록: 프로그램의 실행 상태나 오류 메시지를 파일에 기록하여 추적할 수 있습니다.
  4. 설정 파일 관리: 사용자 설정이나 프로그램 설정을 파일로 저장하여 프로그램을 재시작할 때마다 동일한 설정을 유지할 수 있습니다.
  5. 대용량 데이터 처리: 파일을 통해 대용량 데이터를 읽고 쓸 수 있습니다. 예를 들어, CSV 파일이나 텍스트 파일을 처리할 때 유용합니다.

필요한 헤더 파일

C++에서 파일 입출력을 수행하기 위해서는 <fstream> 헤더 파일을 포함해야 합니다. 이 헤더 파일에는 파일 입출력을 위한 다양한 클래스가 정의되어 있습니다.

#include <iostream>
#include <fstream> // 파일 입출력을 위한 헤더 파일

<fstream> 헤더 파일은 다음과 같은 클래스를 제공합니다:

  • std::ifstream: 파일에서 데이터를 읽기 위한 입력 스트림 클래스입니다.
  • std::ofstream: 파일에 데이터를 쓰기 위한 출력 스트림 클래스입니다.
  • std::fstream: 파일을 읽고 쓰기 위한 입출력 스트림 클래스입니다.

파일 읽기

파일 스트림 객체 생성

파일을 읽기 위해 std::ifstream 클래스를 사용하여 입력 스트림 객체를 생성합니다.

std::ifstream inputFile; // 입력용 파일 스트림 객체 생성

파일 열기

open() 메서드를 사용하여 특정 경로의 파일을 엽니다. 파일이 성공적으로 열렸는지 확인하기 위해 조건문으로 체크합니다.

inputFile.open("example.txt"); // example.txt 파일 열기

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

파일 열기에 실패한 경우, 프로그램은 오류 메시지를 출력하고 종료됩니다. 이는 파일이 존재하지 않거나, 권한이 없을 때 발생할 수 있습니다.

데이터 읽기

파일에서 데이터를 읽어오기 위해 >> 연산자 또는 getline() 함수를 사용할 수 있습니다.

  • 예제 1: 텍스트 파일의 내용을 한 줄씩 읽어오기
std::string line;
while (std::getline(inputFile, line)) {
    std::cout << line << std::endl; // 한 줄씩 출력하기 
}

getline() 함수는 파일에서 한 줄씩 데이터를 읽어와 std::string 객체에 저장합니다. 이 방법은 텍스트 파일의 내용을 전체적으로 읽어올 때 유용합니다.

  • 예제 2: 공백으로 구분된 값을 순차적으로 읽어오기
int number;
while (inputFile >> number) {
    std::cout << "읽은 숫자: " << number << std::endl; // 정수 값 출력하기 
}

>> 연산자는 공백으로 구분된 데이터를 순차적으로 읽어옵니다. 이 방법은 숫자나 단어와 같은 간단한 데이터를 읽을 때 적합합니다.

파일 닫기

파일 읽기 작업이 끝난 후에는 반드시 파일 스트림을 닫아야 합니다. 이를 통해 시스템 자원을 해제하고, 파일에 대한 접근을 종료합니다.

inputFile.close(); // 열린 입력 스트림 닫기 

전체 코드 예시

#include <iostream>
#include <fstream>

int main() {
    std::ifstream inputFile("example.txt");

    if (!inputFile) {
        std::cerr << "파일 열기에 실패했습니다!" << std::endl;
        return 1; // 오류 발생 시 종료 
    }

    std::string line;

    while (std::getline(inputFile, line)) {
        std::cout << line << std::endl; // 각 줄 출력 
    }

    inputFile.close(); // 자원 해제 

    return 0; // 정상 종료 
}

파일 쓰기

파일 스트림 객체 생성

파일에 데이터를 쓰기 위해 std::ofstream 클래스를 사용하여 출력 스트림 객체를 생성합니다.

std::ofstream outFile; // 출력용 파일 스트림 객체 생성

파일 열기

open() 메서드를 사용하여 특정 경로의 파일을 엽니다. 파일이 성공적으로 열렸는지 확인하기 위해 조건문으로 체크합니다.

outFile.open("example.txt"); // example.txt 파일 열기

if (!outFile) {
    std::cerr << "파일을 열 수 없습니다!" << std::endl;
    return 1; // 오류 발생 시 종료
}

데이터 쓰기

파일에 데이터를 쓰기 위해 << 연산자를 사용합니다. 이 연산자는 콘솔 출력과 동일한 방식으로 파일에 데이터를 기록합니다.

outFile << "안녕하세요, C++ 프로그래밍!" << std::endl;
outFile << "이것은 간단한 텍스트 예제입니다." << std::endl;

for (int i = 0; i < 5; ++i) {
    outFile << "숫자 : " << i + 1 << std::endl;
}

파일 닫기

파일 쓰기 작업이 끝난 후에는 반드시 파일 스트림을 닫아야 합니다.

outFile.close(); // 열린 출력 스트림 닫기 

전체 코드 예시

#include <iostream>
#include <fstream>

int main() {
    std::ofstream outFile("example.txt");

    if (!outFile) {
        std::cerr << "파일을 열 수 없습니다!" << std::endl;
        return 1; // 오류 발생 시 종료
    }

    outFile << "안녕하세요, C++ 프로그래밍!" << std::endl;
    outFile << "이것은 간단한 텍스트 예제입니다." << std::endl;

    for (int i = 0; i < 5; ++i) {
        outFile << "숫자 : " << i + 1 << std::endl;
    }

    outFile.close();

    std::cout << "데이터가 example.txt에 성공적으로 기록되었습니다." << std::endl;

    return 0;
}

파일 입출력의 고급 기법

파일 모드 설정

파일을 열 때 모드를 지정하여 읽기 전용, 쓰기 전용, 추가 모드 등을 설정할 수 있습니다. 예를 들어, 파일을 추가 모드로 열면 기존 내용을 유지한 채 새로운 데이터를 추가할 수 있습니다.

std::ofstream outFile("example.txt", std::ios::app); // 추가 모드로 파일 열기

바이너리 모드로 파일 읽기/쓰기

텍스트 모드 대신 바이너리 모드로 파일을 열어 데이터를 읽고 쓸 수 있습니다. 이는 이미지나 오디오 파일과 같은 바이너리 데이터를 처리할 때 유용합니다.

std::ofstream outFile("example.bin", std::ios::binary); // 바이너리 모드로 파일 열기

RAII 원칙 활용

C++에서는 RAII(Resource Acquisition Is Initialization) 원칙을 활용하여 파일 스트림을 자동으로 관리할 수 있습니다. 이를 통해 파일을 명시적으로 닫지 않아도, 스트림 객체가 소멸될 때 자동으로 파일이 닫힙니다.

{
    std::ofstream outFile("example.txt");
    outFile << "RAII 원칙을 활용한 파일 쓰기" << std::endl;
} // outFile 객체가 소멸되면서 파일이 자동으로 닫힘

파일 입출력의 실무 활용 사례

로그 파일 기록

프로그램의 실행 상태나 오류 메시지를 로그 파일에 기록하여 추적할 수 있습니다. 이는 디버깅이나 시스템 모니터링에 유용합니다.

std::ofstream logFile("log.txt", std::ios::app);
logFile << "프로그램 시작 시간: " << std::time(nullptr) << std::endl;

설정 파일 관리

사용자 설정이나 프로그램 설정을 파일로 저장하여 프로그램을 재시작할 때마다 동일한 설정을 유지할 수 있습니다.

std::ofstream configFile("config.txt");
configFile << "language=ko" << std::endl;
configFile << "theme=dark" << std::endl;

대용량 데이터 처리

파일을 통해 대용량 데이터를 읽고 쓸 수 있습니다. 예를 들어, CSV 파일이나 텍스트 파일을 처리할 때 유용합니다.

std::ifstream dataFile("data.csv");
std::string line;
while (std::getline(dataFile, line)) {
    // CSV 데이터 처리
}

결론

C++에서 파일 입출력은 프로그램이 외부 데이터와 상호작용하는 기본적인 방법입니다. 파일을 읽고 쓰는 기능을 통해 프로그램은 데이터를 영구적으로 저장하거나, 이전에 저장한 정보를 다시 활용할 수 있습니다. 파일 입출력을 사용할 때는 항상 에러 처리를 통해 안정성을 높이고, 작업이 끝난 후에는 반드시 파일 스트림을 닫아 자원을 해제하는 습관을 들이는 것이 중요합니다.

728x90