2017-11-30 3 views
3
ifstream dataFile("ints.dat"); 

istream_iterator<int> dataBegin(dataFile); 
istream_iterator<int> dataEnd; 

list<int> data(dataBegin, dataEnd); 

위의 코드가 C++ STL에 있습니다.istream을 사용하여 파일에서 int 데이터 읽기

위의 코드가 작동합니다.

우리는 begin과 end 반복자를 data begin과 data end로 생성합니다. 그러나 dataEnd는 데이터 파일과 관련이 없습니다. 목록에서 범위를 어떻게 알 수 있습니까?

+0

영광스런 EOF 상수로 'dataEnd'를 생각하면 –

답변

4

예를 들어 ref의 예와 같이 std::istream_iterator<int> eos;으로 표시되는 것이 일반적이지만, 사용자가 선택한 이름이 더 적합 할 수 있습니다.

EOF과 유사합니다. 표준 입력의 경우 파일 끝은 읽을 마지막 요소보다 1을 나타냅니다.

eos은 읽을 마지막 요소를지나 1을 나타내는 마지막 반복자와 같습니다.

EOF과 유사하지만 동일하지는 않습니다. 예를 들어, 스트림의 끝을 실제로 명명하는 것은 중요하지 않습니다. 위에서 제공 한 링크에는 구현할 수있는 기능이 있으며 원하는 경우 학습 할 수 있습니다.

또한, cpprefernce는 언급 :

기본-건설 표준 : istream_iterator가 스트림의 마지막 반복자로 알려져 있습니다. 유효한 std :: istream_iterator가 기본 스트림의 끝에 도달하면 은 스트림 끝 반복자과 동일 해집니다. 이를 다시 참조하거나 증가 시키면 정의되지 않은 동작이 호출됩니다.

는 이러한 연산자는 헤더 <iterator>에 오버로드 :

그리고 cplusplus에서

, 우리는이 있습니다.

+0

스트림 끝의 이름을 정말로 중요하지 않습니다. OP 예제의 문맥에서 "dataEnd"라는 이름을 "eos"로 선호합니다. 왜냐하면 더 명확하게 마킹 된 내용과 관련이 있기 때문입니다. – Caleth

+0

올바른 @Caleth, 대답이 업데이트되었습니다. 감사합니다! – gsamaras