[英]C++: I don't understand how this while loop works
我正在看這里的一些問題,這些問題向您展示了如何從txt文件讀取內容,然后將其中的任何內容分配給單獨的變量。 答案使用了一個while循環,看起來像這樣……
ifstream file(“file.txt”);
int var1;
int var2;
int var3;
while (file >> var1 >> var2 >> var3)
{
/* do something with name, var1 etc. */
cout << var1 << var2 << var3 << “\n”;
}
我的問題是,while循環中發生了什么,它允許它為那些變量分配正確的值? 我知道它有效,因為我使用過它,但是我只是不明白它是如何工作的。
這是我正在查看的鏈接,以防萬一有人想要也查看它。 C ++:從文本文件讀取並分成變量
謝謝!
基本上,“表達式” (a) file >> var1 >> var2 >> var3
將嘗試從file
流中讀取三個值並將它們放入指定的變量中。 基本上,它本身與cin >> myVar
沒什么不同(除了它是將輸入更改為多個變量)。
當且僅當成功讀取所有三個值時,整個表達式的值才為true。
在這種情況下,將執行循環主體,將打印出三個值,然后循環將返回頂部並嘗試獲取下三個值。
在表達式的計算結果為假的點(即未讀取三個值),循環將停止。
(a)從someStream >> someVariable
到Boolean值的實際路徑涉及流類中的幾個步驟(將operator>>
的返回值轉換為帶有operator bool
的Boolean),但是以上解釋對於大多數人來說應該足夠好目的。
ifstream重載operator >> 。 在您的特定情況下,它是:
basic_istream& operator>>( int& value );
如您所見,它返回對自身的引用,因此您可以重寫:
while (file >> var1 >> var2 >> var3)
作為函數調用:
while (file.operator>>(var1).operator>>(var2).operator>>(var3))
另外,ifstream明確轉換為bool,如果stream正常,則為true,否則為false。 使用操作符bool進行此轉換,該操作符被標記為顯式的 (C ++ 11及更高版本)。 應用於轉換運算符的該說明符允許在while
循環或if
語句中使用ifstream
實例,但不允許您例如將其分配給bool變量:
bool b = file; // results in error
編譯器會將file >> var1 >> var2 >> var3
為: file.operator>>(var1).operator>>(var2).operator(var3)
basic_istream::operator>>(int&)
的返回值是basic_istream&
因此提取操作符可以在返回時重復調用,因為它返回了對自身的引用。
當您將其評估為: while(file >> var1 >> var2 >> var3)
,編譯器實際上正在執行: while(file.operator>>(var1).operator>>(var2).operator(var3).operator bool())
我們可以看到basic_stream
提供了operator bool()
,這將作為while
循環的條件進行評估。 和operator bool()
:
如果流沒有錯誤並且可以進行I / O操作,則返回
true
。 具體來說,返回!fail()
。
因此,這一行的可讀解釋是:“將var1
, var2
和var3
插入file
。如果插入沒有失敗,則繼續循環。”
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.