2014-01-07 34 views
0

我在這裏要求幫助理解加速C++中提出的一些概念。這是我遇到問題的地方。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; 
} 

定義read_hw的():讀取()的

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); 
} 

定義

// 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; 
} 

我瞭解到目前爲止的方式是,當我們致電:while (read(cin,record))我們要求字符串:record.name和兩個double值:record.midtermrecord.final。在我們的用戶輸入了這些數據後,我們將輸入我們的read_hw()函數,我們將清除之前可能在我們的矢量中的元素。然後,我們輸入並記錄一組值爲一個稱爲record.homework的家庭作業向量。我想我很瞭解這一點。如果沒有,請讓我知道。

我不明白我們的函數知道什麼時候返回,因此返回到我們的第一個while循環。編輯:啊,用戶必須做兩次和結束文件通知結束程序。所以我想我回答了我自己的問題......但是有人能夠在我們的read_hw()函數中解釋if(in)的用途,這將會非常有幫助。這將是if(cin),那麼等待我們的用戶輸入數據?或者是if(cin)自動爲真? (爲什麼?)

+0

現在我明白了。謝謝你們的幫助。我有點理解該函數的基本工作方式。但是現在我看到if(cin)表達式,特別是除了文件結束之外,可以決定我們是否繼續運行while循環。 – zzz2991

回答

3

if(cin)不等待 - 它檢查錯誤。只有操作員>>等待輸入。在這種情況下while(in >> x)會讀取並等待。它處於while循環條件之內的原因是因爲在in >> x完成之後,它返回對in的引用,該引用隱式轉換爲bool,用於發出諸如if(cin)之類的錯誤。

在這兩種情況下,如果沒有錯誤,cin將爲真;如果存在錯誤,則cin爲true。

This給出了一個更好的想法,但可能不是歡迎。基本上,每當一個istream被視爲一個bool時,事實就是沒有錯誤,如果發生了錯誤,則是錯誤的。

基本上,將istream(稱爲foo)轉換爲bool總是!foo.fail()。所以它與fail()相反。這意味着有兩種方法可以是真實的(直接從表here

  1. 邏輯錯誤的I/O操作(讀錯類型等)
  2. 的讀/我編寫錯誤/ O操作(不可預知的東西)

因此文件結尾不是蓋的。這必須用EOF()或類似的檢查。

如果一個IStream作品出來是假,就可以區分1和2使用bad()。如果bad是true,那麼就是case 2,如果bad()是假的,它會是案例1.(還有其他方法,看看rdstate())

+0

或OP可以使用如果std :: cin.fail()或std :: cin.good()。 – Brandon

+0

好吧我想我現在看到if(cin)的使用和解釋。雖然我不一定明白它是如何工作的(鏈接沒有太多幫助:P)。我想現在可以。所以如果我想讓if(cin)爲false,我可以做一些事情,比如在record.midterm期待一個整數時輸入一個字符串,然後它將退出while循環。是對的嗎? – zzz2991

+0

@DavidJhoo是的 - 實際上有兩種方式可以是假的(它實際上返回!cin.fail())。第一種方法是「邏輯I/O錯誤」,例如將字符串讀入到一個int中,第二種方法是「對I/O操作的讀/寫錯誤」 – user3125280