C++ I/O 및 파일 조작 - 4. 파일 조작 (File Manipulation)

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

 

📘 4. 파일 조작 (File Manipulation)

파일을 단순히 읽고 쓰는 것 외에도, 실제 개발 과정에서는 파일 존재 여부 확인, 크기 측정, 읽기/쓰기 위치 조정 등 고급 조작 기능이 필요합니다.
C++17부터는 <filesystem> 헤더가 추가되어 다양한 파일 조작이 간편하게 가능해졌습니다.


✅ 파일 존재 여부 확인

C++17의 <filesystem> 라이브러리를 사용하면 특정 파일이 존재하는지 쉽게 확인할 수 있습니다.

#include <iostream>
#include <filesystem>

int main() {
    std::string filename = "file.txt";
    if (std::filesystem::exists(filename)) {
        std::cout << filename << " 파일이 존재합니다." << std::endl;
    } else {
        std::cout << filename << " 파일이 존재하지 않습니다." << std::endl;
    }
    return 0;
}

📌 std::filesystem은 C++17 이상에서 지원되므로, 컴파일 시 -std=c++17 옵션이 필요할 수 있습니다.


✅ 파일 크기 확인

파일 크기를 확인하려면 파일을 바이너리 모드로 열어 끝으로 이동 후 위치를 측정합니다.

#include <iostream>
#include <fstream>

int main() {
    std::ifstream file("file.txt", std::ios::binary);
    if (!file) {
        std::cerr << "파일을 열 수 없습니다." << std::endl;
        return 1;
    }

    file.seekg(0, std::ios::end);         // 파일 끝으로 이동
    std::streampos size = file.tellg();   // 현재 위치 = 파일 크기
    file.close();

    std::cout << "파일 크기: " << size << " 바이트" << std::endl;
    return 0;
}

📌 텍스트 모드가 아닌 바이너리 모드(std::ios::binary)로 열어야 정확한 크기 측정이 가능합니다.


✅ 파일 위치 조정 (읽기/쓰기 위치 이동)

파일 스트림에서는 읽기 위치쓰기 위치를 자유롭게 이동할 수 있습니다.

  • seekg(offset, base) → get pointer(읽기 위치) 이동
  • seekp(offset, base) → put pointer(쓰기 위치) 이동
#include <fstream>

int main() {
    std::fstream file("file.txt", std::ios::in | std::ios::out);
    if (!file) return 1;

    file.seekg(5);                         // 읽기 위치를 5바이트로 이동
    file.seekp(0, std::ios::end);         // 쓰기 위치를 파일 끝으로 이동

    file.close();
    return 0;
}
기준 위치 (base) 의미
std::ios::beg (기본값) 파일의 시작 위치
std::ios::cur 현재 위치
std::ios::end 파일의 끝 위치

✅ 특정 위치에서 읽기

파일 내의 특정 위치로 이동하여 한 문자 또는 문자열을 읽을 수 있습니다.

#include <iostream>
#include <fstream>

int main() {
    std::ifstream file("file.txt");
    if (!file) return 1;

    file.seekg(10);  // 파일 내 10바이트 위치로 이동

    char ch;
    file.get(ch);    // 해당 위치에서 문자 1개 읽기

    std::cout << "10번째 위치의 문자: " << ch << std::endl;

    file.close();
    return 0;
}

📌 get()은 istream에서 한 문자씩 읽을 때 유용합니다.
파일 크기보다 큰 위치로 이동하거나 파일이 너무 짧으면 읽기에 실패할 수 있으니 주의가 필요합니다.


📝 정리 요약

기능 메서드 / 함수 비고
파일 존재 확인 std::filesystem::exists() C++17 이상 필요
파일 크기 확인 seekg + tellg 반드시 ios::binary로 열 것
읽기 위치 이동 seekg(offset, base) 기본값: std::ios::beg
쓰기 위치 이동 seekp(offset, base)  
특정 위치 읽기 seekg() + get() 문자 단위 읽기