2010-01-26 2 views
13

나는 다음 코드를 가지고 꽤 잘 작동한다. (꽤 느리다는 것 외에는별로 신경 쓰지 않는다.) 그것은 infile의 전체 내용을 outfile에 쓰는 것이 직관적 인 것처럼 보이지 않습니다.ifstream :: rdbuf()는 실제로 무엇을합니까?

// Returns 1 if failed and 0 if successful 
int WriteFileContentsToNewFile(string inFilename, string outFilename) 
{ 
    ifstream infile(inFilename.c_str(), ios::binary); 
    ofstream outfile(outFilename.c_str(), ios::binary); 

    if(infile.is_open() && outfile.is_open() && infile.good() && outfile.good()) 
    { 
     outfile << infile.rdbuf(); 

     outfile.close(); 
     infile.close(); 
    } 
    else 
     return 1; 

    return 0; 
} 

어떤 통찰력이라도 있습니까?

+1

나는'close()'에 대한 명시 적 호출이 필요 없다고 덧붙일 것이다. 어쨌든 파괴자는 똑같이 할 것입니다. 그리고 그것은 몇 줄을 절약합니다. ;) –

답변

12

예, 표준에서 지정되었으며 실제로는 매우 간단합니다. rdbuf()은 주어진 [io]stream 객체에 대한 기본 basic_streambuf 객체에 대한 포인터를 반환합니다.

basic_ostream<...>basic_streambuf<...>의 내용에서 기록 basic_streambuf<...>에 대한 포인터에 대한 operator<<에 대한 과부하가 있습니다.

+2

하지만 연산자 <<는 단지 하나의 청크를 작성하지 않습니까? 모든 것을 하나의 덩어리로 작성한다는 것은 쉽지 않습니다. 포인터라고 생각하지만 그 포인터는 전체 데이터를 하나의 덩어리로 포함하고 있습니까? 나는 아직도 조금 혼란 스럽다. –

+3

나는 '하나의 덩어리'로 무엇을 몰고 가는지 잘 모르겠다. 버퍼의 끝에 도달하거나 출력하는 중에 오류가 날 때까지 문자로 가리키는 'streambuf'문자의 내용을 출력하도록 지정되었습니다. 'streambuf'는 클래스 인스턴스이며 제어 된 시퀀스를 연속 메모리에 저장할지 여부를 지정하지 않으며 인터페이스에서 유추 할 수 없습니다. –

+0

그래, 버퍼 끝에 도달 할 때까지 문자 단위로 문자를 처리합니다. 어떻게 알았어? 제공된 인터페이스에서 보지 못했습니다. –

15

iostream 클래스는 I/O 버퍼 주변의 래퍼입니다. iostream 자체는 전체적으로 많은 작업을 수행하지 않습니다 ... 주로, operator>> 형식 지정 연산자를 제공합니다. 버퍼는 basic_streambuf에서 파생 된 객체로 제공되며 rdbuf()을 사용하여 가져오고 설정할 수 있습니다.

basic_streambuf은 파일, 문자열 등을 읽고 쓰기위한 균일 한 인터페이스를 제공하기 위해 오버 라이딩되는 많은 가상 함수가있는 추상 기반입니다. basic_ostream<…>::operator<<(basic_streambuf<…>) 함수는 기본 데이터 소스가 지쳤다.

iostream은 끔찍한 엉망입니다.

+0

나는 동의한다. 그리고 이것은 좋은 대답이다. 그러나 Charles는 그의 대답을 먼저 제출했다. 그래서 그는 우승자 다. 나는 비록 당신의 대답을 투표했다! –

관련 문제