C++에서 파일 전체 내용을 std::string으로 한 번에 읽어 들이는 것은 텍스트 처리 작업에서 자주 사용되는 기법입니다. 이 글에서는 가장 간단하고 널리 쓰이는 방법인 rdbuf()와 문자열 스트림을 활용한 방법을 소개합니다.
알고리즘
시작
파일 이름을 입력 스트림으로 받습니다.
string 변수 str을 선언합니다.
rdbuf()를 사용하여 파일 끝까지 데이터를 읽습니다.
읽은 데이터를 str에 저장합니다.
데이터를 출력합니다.
끝.예제 코드
#include<iostream>
#include<fstream>
#include<sstream>
#include<string>
using namespace std;
int main() {
ifstream f("a.txt");
string str;
if(f) {
ostringstream ss;
ss << f.rdbuf();
str = ss.str();
}
cout<<str;
}코드 설명
- ifstream: 파일을 읽기 전용으로 여는 입력 파일 스트림입니다. 생성자에 파일 이름을 전달하면 파일이 자동으로 열립니다.
- if(f): 파일이 정상적으로 열렸는지 확인하는 조건문입니다. 파일이 존재하지 않으면 오류 없이 안전하게 건너뜁니다.
- ostringstream: 출력용 문자열 스트림으로, 스트림 버퍼의 내용을 문자열로 변환할 때 사용됩니다.
- f.rdbuf(): 파일 스트림의 내부 버퍼에 직접 접근하여 파일 전체를 한 번에 복사합니다. 이것이 이 방법의 핵심입니다.
- ss.str(): 스트림에 누적된 내용을 최종적으로
std::string형태로 반환합니다.
입력
a.txt 파일에는 문자열 “hi”가 들어 있습니다.
출력
hi
참고 사항
이 방식은 코드가 짧고 직관적이라 가독성이 뛰어나지만, 대용량 파일을 다룰 때는 메모리를 두 번(스트림 버퍼와 문자열) 사용하게 될 수 있습니다. C++11 이상에서는 std::istreambuf_iterator를 이용한 초기화나, 파일 크기를 미리 확인해 string::resize() 후 read()로 읽는 방법도 성능 면에서 좋은 대안이 됩니다.