2017-04-04 1 views
0

요약 & 나의 이해 :는 올바른 결과를 얻을 수

내 질문은 좋지 않다 "동일 ifstream으로 두 번 istream_iterator 사용"을 참조 할 수

첫 번째 탐색 후에 스트림이 이미 (파일 끝)에 도달했기 때문입니다. istream_iterator는 단일 패스 반복자입니다

  1. 때문에, 그래서 우리는 다시 스트림을 다시로드 다시 을 갈 수 없어 우리가 istream_iterator을 사용하기 때문에 전체 스트림을 통과합니다.
  2. 스트림이 이미 파일 끝 부분에 도달했기 때문에 새 반복기를 바인딩하더라도 iterator는 여전히 파일 끝을 가리 킵니다.

내 질문에 답변 해 주신 ppl!

====================

업데이트 : 두 가지로

  1. : 난 그냥 몇 가지 샘플 테스트를했다

    ifstream 개체의 경우 결과가 정확합니다.
  2. 두 개의 서로 다른 동일한 객체에 결합하는 결과는 정확하지 않다; 파일에 아무것도 넣지 않고 번호 2이 있습니다.

아래의 @aschepler의 답변과 마찬가지로 istream_iterator은 단일 패스 반복기이며 자체 증가 후에는 유효하지 않습니다. 그러나 새로운 iterator가 여전히 이것을 위해 어떻게 작동하지 않는가? 왜 프로그램을 작동시키기 위해 두 개의 서로 다른 ifstream 개체를 만들어야합니까?

답변 해 주셔서 감사합니다.

=================== 원래 질문 여기에 ====================== ==

나는 C++ 입문서 5 단 (p.407)에서 운동 10.33에 관한 질문이 있습니다. 이 부분에서 문제가 발생했습니다 :

ostream_iterators를 사용하여 홀수를 첫 번째 출력 파일에 쓰고 짝수를 두 번째 파일에 씁니다.여기

일부 해상력 :

for_each(int_in, int_in_eof, [&int_out_odd, &int_out_even](const int i) 
          { *(i & 0X1 ? int_out_odd : int_out_even)++ = i; }); 

올바른 결과는 다음과 같습니다 :

ifstream ifs(argv[1]); 
istream_iterator<int> int_in(ifs); 
istream_iterator<int> int_in_eof; 

ofstream ofs_odd(argv[2]); 
ofstream ofs_even(argv[3]); 

ostream_iterator<int> int_out_odd(ofs_odd, " "); 
ostream_iterator<int> int_out_even(ofs_even, " "); 

사실 표준 : : for_each를 좋은 일을했다

input file: 1 2 3 4 5 6 7 8 9 
output_odd: 1 3 5 6 9 
output_even: 2 4 6 8 

그럼 copy_if를 사용하여 구현하려고 시도 :

//copy odd number to odd file 
copy_if(int_in, int_in_eof, int_out_odd, [](const int i) 
          {return i & 0X1; }); 
//copy even number to even file 
copy_if(int_in, int_in_eof, int_out_even, [](const int i) 
          {return !(i & 0X1); }); 

결과는 다음과 같습니다

input file: 1 2 3 4 5 6 7 8 9 
output_odd: 1 3 5 6 9 
output_even: 

나는 심지어 파일 내부에 아무것도 없어.

제 질문은 istream 내부의 내용을 변경하는 첫 번째 copy_if입니까?

미리 도움 주셔서 감사합니다.

+0

는 내가 가장 좋은 방법은이 값을 유지하기 위해 컨테이너를 만들 수있을 거라고 생각하고 그 후속 순회을, 예를 들어,'벡터 input_values ​​(istream_iterator (IFS), istream_iterator 는());'그렇지 않으면, 당신은 것 다시 전체 파일을 다시 열어야합니다. 너의 대답에 대해 –

답변

0

istream_iterator은 ForwardIterator가 아닌 단일 패스 반복자입니다. ++iter을 수행 한 후에 iter의 이전 복사본이 잘못되었습니다.

+0

고마워. 그래서 내 이해는,'copy_if '사용을 고집한다면, 나는 두 개의 다른'istream_iterator' 권리를 만들 필요가 있는가? 아니면 두 개의 다른 ifstream 객체를 만들어야합니까? –

관련 문제