요약 & 나의 이해 :는 올바른 결과를 얻을 수
내 질문은 좋지 않다 "동일 ifstream으로 두 번 istream_iterator 사용"을 참조 할 수첫 번째 탐색 후에 스트림이 이미 (파일 끝)에 도달했기 때문입니다. istream_iterator
는 단일 패스 반복자입니다
- 때문에, 그래서 우리는 다시 스트림을 다시로드 다시 을 갈 수 없어 우리가
istream_iterator
을 사용하기 때문에 전체 스트림을 통과합니다. - 스트림이 이미 파일 끝 부분에 도달했기 때문에 새 반복기를 바인딩하더라도 iterator는 여전히 파일 끝을 가리 킵니다.
내 질문에 답변 해 주신 ppl!
====================
업데이트 : 두 가지로
- : 난 그냥 몇 가지 샘플 테스트를했다
ifstream
개체의 경우 결과가 정확합니다. - 두 개의 서로 다른 동일한 객체에 결합하는 결과는 정확하지 않다; 파일에 아무것도 넣지 않고 번호
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입니까?
미리 도움 주셔서 감사합니다.
는 내가 가장 좋은 방법은이 값을 유지하기 위해 컨테이너를 만들 수있을 거라고 생각하고 그 후속 순회을, 예를 들어,'벡터 input_values (istream_iterator (IFS), istream_iterator 는());'그렇지 않으면, 당신은 것 다시 전체 파일을 다시 열어야합니다. 너의 대답에 대해 –