2016-08-06 9 views
1

ifstream에서 .rdbuf()을 사용하는 것이 어떻게 든 변경되는 것으로 나타났습니다. 다음 코드는 문제를 보여줘야합니다. 이 날 귀찮게한다ifstreams 및 rdbuf()와의 이상한 동작

#include <fstream> 
#include <iostream> 

using namespace std; 

int main(int argc, const char * argv[]) { 
    ifstream ifs("Sample.csv"); 
    cout << "Reading buffer: " << endl; 
    cout << ifs.rdbuf(); // Outputs buffer as expected 
    cout << "Reading buffer again: " << endl; 
    cout << ifs.rdbuf(); // Returns nothing 

    return 0; 
} 

이유는 내가 현재 또 다른 ofstream ofs; ofs << ifs.rdbuf()을 사용으로 하나 개의 텍스트 파일의 내용을 복사하기 위해 노력하고 있다는 점이다. 이것은 잘 작동하지만 ifs에서 getline(ifs, str)을 사용하면 스트림을 효과적으로 "파괴"하지 못하게됩니다.

+1

무엇이 문제입니까? 이미 파일에서 모든 것을 읽었습니다. 왜 읽어야 할 부분이 남아 있으리라고 생각하십니까? –

+4

호출을 통해 스트림을 사용했기 때문에 파일을 되 감을 필요가 있습니다. 호출 사이에'ifs.seekg (0);'을 삽입하십시오. –

+5

답변 섹션은 다음과 같습니다. –

답변

3

특히 "이상한"것은 아닙니다. 그것은 당신이 매일 보는 동일한 하천의 행동입니다. 스트림이있다

std::stringstream ss("1"); 
int x; 
if (ss >> x) 
    cout << x; 
if (ss >> x) // doesn't work a second time; "1" is already extracted 
    cout << x; 

으로 : 원래 스트림 직접 읽을 것 같이 당신의 cout 다음 단지에서 읽는 것을, 버퍼에 대한 포인터입니다 rdbufstd::stringstream::str()처럼되지 않습니다 그것은 — 마법 아니다 파일 스트림을 사용하면 을 처음부터 다시 검색 할 수 있습니다 (본질적으로 기본 버퍼와 동일하게 수행합니다).

+1

OP에 익숙한 가능성이있는 것을 사용하여 동일한 동작을 전달합니다. 잘 했어. – WhozCraig

2

ifs.rdbuf()ifs의 해당 스트림 버퍼 객체에 대한 포인터를 반환합니다. 버퍼 오버런에 도달 할 때까지 (eof) 오버로드하면 버퍼에서 정보를 가져옵니다. .rdbuf()을 호출하면 버퍼의 끝에서 읽을 것이 없으므로 "아무것도"를 반환하지 않습니다. 버퍼 검색 위치는 ifs.seekg (0);을 호출하여 명시 적으로 0으로 재설정됩니다.

+3

주 :'ifs.rdbuf()'를 호출하는 것만으로는 찾기 위치를 앞당길 수 없습니다. 단순히 스트림과 관련된 스트림 버퍼 객체에 대한 포인터를 반환합니다. 그 포인터로 끝난 것은 * 나중에 문제가됩니다. 이 경우'operator <<'overload를 통해'std :: cout'으로 보내고,'eof'가 될 때까지 스트림 버퍼의 seekg 위치를 앞 당깁니다. 요컨데, 그것은'rdbuf()'의 결과를 싱크 (sink)에 보내고있다. 'rdbuf()'에 의한 버퍼 객체의 획득은 그 일련의 사건의 첫 단계 일뿐입니다. – WhozCraig

+0

나는 이것을 upvote하고 싶지만 WhozCraig는 옳다. 그 순간은 정확하지 않다. –