내가 여기에 질문을 할 때마다, 아주 바보 같은 실수가된다. (당신이 나를 믿지 않는다면 나의 역사를 확인하라. 여기 있습니다.C++ istream 연산자 >> 불량 데이터 처리
내 질문이 매우 인기가 있어야한다고 생각하지만 그것에 대해 아무 것도 찾을 수 없으며 시도해 볼 아이디어가 부족합니다.
어쨌든, 속히 : 내가 입력 operator>>
과부하하기 위해 노력하고있어
. 그것은 등 char
의, float
의, 자연적으로
등 유효하지 않은 데이터를 건너 뛰는, 파일에서 한 번에 하나 개의 정수을 읽을하기로했다, 나는 모두 의 get() 다음의 토큰 if(in >> inNum)
를 확인 해요 및 get()을 확인하십시오.
성공하면 그다지 말할 것도 없습니다. 실패하면
는 그러나, 나는 두 가지 중 하나가 발생한다고 가정
- 그것은 여기
내가 처리하려고 방법 년대 EOF에 도달
istream& operator>> (istream& in, SortSetArray& setB) {
bool eof = false;
int inNum = -1;
while(!eof) {
if(in >> inNum) {
cout << "DEBUG SUCCESS: inNum = " << inNum << endl;
setB.insert(inNum);
}
else {
// check eof, using peek()
// 1. clear all flags since peek() returns eof regardless of what
// flag is raised, even if it's not `eof`
in.clear();
cout << "DEBUG FAIL: inNum = " << inNum << endl;
// 2. then check eof with peek()
eof = (in.peek() == std::char_traits<char>::eof());
}
}
return in;
}
파일에 [1 2 3 4 a 5 6 7]이 있고 프로그램이 자연스럽게 무한 루프가됩니다. 좋아요, peek()은 char 'a'를 사용하지 않으며, in >> inNum
도 어쨌든 그것을 사용하지 않았습니다. 아니, 그냥 시도해 볼게.
그리고 그것은 내가 지난 2 시간 동안 있었던 곳입니다. 나는 파일에서 char
대신 istream :: ignore(), istream :: get(), ios :: rdstate를 시도하여 double
과 string
대신 char
을 숫자로 읽었을 때를 대비했다.
아무것도 작동하지 않고 필사적입니다. 나는 형식의 라인에 데이터 항목의 삼중을 읽을 수 있었다 곳
이 이상하게만큼, 접근 방식은 위의 이전 프로그램 일 : string
int
int
내가 그 하나에 대한 ifstream
객체를 사용하는 유일한 차이점은, 이 개체는 istream
입니다.
보너스 질문 : 딸꾹질이 발생하면 inNum의 값은 0입니다. 나는 istream :: operator >>가하는 일이라고 추측하고있다.
사용'in.clear을(); '을 일으키는 오류 플래그를 지우고 다시 시도 편집 : 또한'CIN를 추가합니다.. ignore (std :: numeric_limi ts :: max(), '\ n');'스트림에 갇혀있는 문자를 지우려면 –
Gasim
@Gasim 무슨 뜻인지 모르겠다. 그것이 else {} 본문에서 내가 한 첫 번째 것입니다. 내가 어디에서()'취소해야합니까? – Kafeaulait
죄송합니다, 편집을 읽으십시오 – Gasim