Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++에서 전체 ASCII 파일을 std::string으로 한 번에 읽어들이는 방법

C++에서 텍스트(ASCII) 파일의 전체 내용을 std::string 변수에 한 번에 담아야 하는 경우가 종종 있습니다. 이 글에서는 ifstreamostringstream을 활용해 파일 전체를 문자열로 손쉽게 변환하는 가장 간단한 방법을 소개합니다.

알고리즘

시작
    ifstream 타입의 파일 객체 f를 사용해 a.txt 파일을 열고 읽기 작업을 준비합니다.
    string 타입의 변수 str을 선언합니다.
    만약 파일이 정상적으로 열렸다면(if(f))
        ostringstream 타입의 변수 ss를 선언합니다.
        rdbuf() 함수를 호출하여 파일 객체의 버퍼 데이터를 읽어 옵니다.
        파일 객체의 데이터를 ss에 저장합니다.
        ss에 담긴 문자열을 str에 대입합니다.
    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;
}

입력

"hi"라는 텍스트가 담긴 a.txt 데이터 파일

출력

hi

코드 설명

이 코드의 핵심은 rdbuf() 메서드입니다. ifstream 객체의 rdbuf()는 파일과 연결된 내부 스트림 버퍼에 대한 포인터를 반환하며, 이를 스트림 삽입 연산자(<<)를 통해 ostringstream에 넣으면 파일의 모든 내용이 한 번에 문자열 스트림으로 복사됩니다. 이후 ss.str()을 호출하면 스트림에 저장된 전체 내용을 std::string 형태로 얻을 수 있습니다.

또한 if(f) 조건문은 파일이 성공적으로 열렸는지 확인하는 역할을 합니다. 파일 열기에 실패하면 아무 내용도 읽히지 않으므로, 실제 프로젝트에서는 파일 열기 실패 시 적절한 에러 메시지를 출력하거나 예외 처리를 추가하는 것이 좋습니다.

대안: 반복자를 활용한 방법 (C++11)

C++11 이후에는 std::string 생성자와 istreambuf_iterator를 사용하여 동일한 결과를 얻을 수도 있습니다.

#include<fstream>
#include<string>
#include<iterator>

std::ifstream f("a.txt");
std::string str((std::istreambuf_iterator<char>(f)),
                std::istreambuf_iterator<char>());

두 방법 모두 파일 크기만큼의 메모리를 사용한다는 점을 기억하세요. 매우 큰 파일을 다룰 때는 메모리 사용량을 고려하여 필요에 맞는 방식을 선택하는 것이 바람직합니다.