2011-06-13 9 views
2

데이터 스트림을 처리 할 때 템플릿 및 반복기 측면에서 코드를 작성하는 것이 좋습니다. 종종 다음 캐릭터를 "엿보기"해야합니다.std :: istreambuf_iterator std :: ifstream을 사용하여 "peek"

template <class I> 
I next(I it) { 
    return ++it; 
} 

은 물론,이, 반복자의 복사본을 만드는 사본을 증가하고 반환 코드가 더-양방향 반복자를 처리하지 할 수 있도록하기 위해, 나는이처럼 보이는 조각이있다. 이것은 매우 멋지게 작동하는 경향이 있습니다 ... std::istreambuf_iteratorstd::ifstream에서 작동하는 경우를 제외하고는. 예를 들어, 내용 "ABCD", 다음과 같은 코드를 사용하여 파일 "test.txt을"주어진 :

#include <fstream> 
#include <iostream> 

template <class I> 
I next(I it) { 
    return ++it; 
} 

int main() { 
    std::ifstream file("test.txt", std::ios::binary); 
    std::istreambuf_iterator<char> it(file); 
    std::cout << *next(it) << std::endl; 
    std::cout << *it << std::endl; 
} 

출력은 다음과 같습니다

대신 내가 바라는 것의
$ ./test 
B 
B 

:

$ ./test 
B 
A 

즉, 반복기의 복사본 하나를 증가 시키면 순차적으로 이 증가하고 그 중 개가 복사됩니다.

필자는 파일 스트림 반복기가 현재 파일과 관련된 읽기 버퍼에있는 것만 조작 할 수 있다는 점에서 한계가 있음을 알고 있습니다. 그래서 내가 원하는 것과 정확히 일치하는 해결책이 없을 수도 있습니다. 내가 원하는 것을 할 수있는 방법이 있습니까?

답변

2

음, 사실 모든 반복자를 증가하지 않고 오히려 이 결국 같은 효과를 스트림을 소모한다. 미리 들여다보고 싶으면 스트림 자체에서 AFAIK해야합니다.

+0

예, 알았어요. 그래서 내가 "그물 효과"라고 ​​말했다. 나는 그 캐릭터가 증가함으로써 "소비"되었다는 것을 알았고, 나는 단지 내가 원하는 것을 영리하게하기를 희망했다. –

+0

명시 적으로 '탐색'해야합니다. iternator는 그런 식으로 작동하지 않습니다. –

0

게시물 제목에 '엿보기'라고 언급하셨습니다. std :: istream에는 peek() 메서드가 있습니다. 사용하십시오.

+1

하지만 이터레이터로 작업하고 싶습니다. 포인터는 포인터 나 itd :: istreambuf_iterator 또는 iterator처럼 작동하는 코드로 작업 할 수있는 것이 이상적입니다. –

0

스트림 버퍼 반복자는 원 패스 반복자입니다. 뒤로 이동할 수 없으며 몇 가지 예를 들어 vector::iteratorstring::iterator과 같은 양방향 기능이 없습니다. 다른 이터레이터 인스턴스와 독립적으로 파일 스트림에서 작동하는 스트림 반복기의 격리 된 복사본을 만드는 방법은 없습니다. 스트림 이터레이터는 복사 여부에 관계없이 항상 스트림 객체에서 작동하므로 불가능합니다. 이터레이터를 복사해도 파일 스트림은 복사되지 않습니다.

관련 문제