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() | 문자 단위 읽기 |
'프로그래밍 언어 > C++' 카테고리의 다른 글
C++ I/O 및 파일 조작 - 6. 스트링 스트림 (String Streams) (0) | 2025.03.30 |
---|---|
C++ I/O 및 파일 조작 - 5. 바이너리 파일 입출력 (Binary File I/O) (0) | 2025.03.30 |
C++ I/O 및 파일 조작 - 3. 파일 입출력 기본 (Basic File I/O) (0) | 2025.03.30 |
C++ I/O 및 파일 조작 - 2. 표준 입출력 (Standard Input/Output) (0) | 2025.03.30 |
C++ I/O 및 파일 조작 - 1. 개요 (Introduction) (0) | 2025.03.30 |