2014-01-07 2 views
0

저는 가속화 된 C++에서 제시된 몇 가지 개념을 이해하는 데 도움이 필요합니다. 여기 내가 문제가있는 곳입니다. read_hw의if (cin)의 목적은 무엇입니까?

istream& read(istream& is, Student_info& s) 
{ 
// read and store the student's name and midterm and final exam grades 
is >> s.name >> s.midterm >> s.final; 
read_hw(is, s.homework); // read and store all the student's homework grades 
return is; 
} 

정의() : 읽기()의

vector<Student_info> students; //Student_info is a structure we made 
Student_info record; 
string::size_type maxlen = 0; 


// read and store all the records, and find the length of the longest name 
while (read(cin, record)) { //Here is where I find hard to follow 
maxlen = max(maxlen, record.name.size()); 
students.push_back(record); 
} 

정의 while (read(cin,record)) 우리가 물어 :

// read homework grades from an input stream into a vector<double> 
istream& read_hw(istream& in, vector<double>& hw) 
{ 
if (in) { 
// get rid of previous contents 
hw.clear() ; 
// read homework grades 
double x; 
while (in >> x) 
hw.push_back(x); 
// clear the stream so that input will work for the next student 
in.clear(); 
} 
return in; 
} 

내가 지금까지 그것을 이해하는 방법은 우리가 호출 할 때이다 문자열 : record.name 및 두 개의 double 값 : record.midtermrecord.final. 사용자가 해당 데이터를 입력하면 우리 벡터에 있던 이전 요소를 지우는 read_hw() 함수를 입력합니다. 그런 다음 record.homework이라는 숙제 등급의 벡터에 일련의 값을 입력하고 기록합니다. 나는 그걸 많이 이해하고 있다고 생각합니다. 그렇지 않다면 알려주세요.

우리 함수가 언제 복귀해야 하는지를 이해하지 못하기 때문에 첫 번째 while 루프로 돌아갑니다. 편집 : 아, 사용자가 프로그램을 끝내려면 두 번 파일 알림을 두 번 만들어야합니다. 그래서 나는 내 자신의 질문에 대답했다고 가정합니다. 그러나 누군가가 우리의 read_hw() 함수에서 if(in)의 목적을 설명 할 수 있다면 매우 도움이 될 것입니다. if(cin)이 될 것이므로 사용자가 데이터를 입력 할 때까지 기다리시겠습니까? 또는 if(cin)이 자동으로 true입니까? (이유는 무엇입니까?)

+0

이제 알겠습니다. 도움을 주셔서 감사합니다. 나는 그 기능이 작동하는 기본적인 방식을 이해했다. 하지만 이제는 파일 끝을 제외하고 if (cin) 표현식이 while 루프를 계속 실행할지 결정할 수 있는지를 확인했습니다. – zzz2991

답변

3

아니요 if(cin)은 기다리지 않습니다. 오류를 확인합니다. 연산자 >>만이 입력을 기다립니다. 이 경우 while(in >> x)은 읽기 및 대기 중입니다. while 루프 조건에있는 이유는 in >> x이 완료된 후 in에 대한 참조를 반환하기 때문에 암시 적으로 if(cin)과 같은 오류를 알리는 데 사용되는 bool로 변환되기 때문입니다.

두 경우 모두 오류가 없으면 cin이 true이고 오류가 발생하면 false가됩니다.

This은 무엇이 진행되고 있는지 더 잘 알 수 있지만 환영하지 않을 수 있습니다. 기본적으로 istream이 bool처럼 처리 될 때마다 오류가 없었 음이 사실이며 오류가 발생하면 false가됩니다.

기본적으로 istream (foo라고 부름)을 bool로 변환하는 것은 항상! foo.fail()입니다. 그래서 그것은 fail()의 반대입니다. i에서

  1. 논리 오류/O 작업 (잘못된 유형을 읽는 등)
  2. 읽기/I에 오류를 기록/O 작업이 두 가지 방법이 바로 테이블 here에서 (사실이 될 수 있습니다 의미

그래서 파일의 끝 (예측할 수없는 물건이) 전혀 적용되지 않습니다. 즉, EOF() 또는 이와 유사한으로 확인해야합니다.

를 istream을이 거짓 밖으로 작동하는 경우, 당신은 구별 할 수 1과 2는 bad()를 사용하고, bad가 true이면 case 2, bad()가 거짓, 그것은 사건 1이 될 것입니다. (다른 방법들도 있습니다, rdstate()를보십시오)

+0

또는 OP는 std :: cin.fail() 또는 std :: cin.good() 인 경우 사용할 수 있습니다. – Brandon

+0

OK 그 설명과 함께 지금 if (cin)의 사용을 보았습니다. 나는 그것이 어떻게 작동 하는지를 반드시 이해할 수는 없지만 (링크는별로 도움이되지 않았다 : P). 나는 그것이 지금 ok다고 생각한다. 그래서 if (cin) false를 만들고 싶다면, record.midterm과 같은 정수형이 필요할 때 문자열을 입력 한 다음 while 루프를 종료하는 것과 같은 작업을 수행 할 수 있습니다. 그게 맞습니까? – zzz2991

+0

@DavidJhoo 예 - 실제로 거짓이 될 수있는 두 가지 방법이 있습니다 (실제로는! cin.fail()을 반환합니다). 첫 번째 방법은 문자열이 int로 읽히는 것과 같은 "논리적 인 I/O 오류"이고 두 번째 방법은 "I/O 작업에서 읽기/쓰기 오류"입니다. – user3125280

관련 문제