2016-08-08 115 views
0

當我在一個測試中使用std :: istream對象(在cplusplus.com下面的例子中,一個std :: ifstream):「if(myistreamobject)」,該對象是自動分配的在堆棧中永遠不會是空的,對吧?...在​​下面的例子中,我們使用相同的測試來檢查是否所有的字節都是從文件中讀取的......這真是一個奇怪的代碼,我通常在使用這種風格時我正在處理指針...測試一個istream對象

我想知道在std :: istream中使用哪種機制在測試中返回一個值,以及該值的真正含義......(最後的成功/失敗操作??)它是一個布爾轉換的重載(像MFC類CString中的const char *操作符)或者它是另一種技術?

因爲該對象永遠不會爲空,因此將其放入測試中將始終返回true。

// read a file into memory 
#include <iostream>  // std::cout 
#include <fstream>  // std::ifstream 

int main() { 

    std::ifstream is ("test.txt", std::ifstream::binary); 
    if (is) { 
    // get length of file: 
    is.seekg (0, is.end); 
    int length = is.tellg(); 
    is.seekg (0, is.beg); 

    char * buffer = new char [length]; 

    std::cout << "Reading " << length << " characters... "; 
    // read data as a block: 
    is.read (buffer,length); 

    if (is) // <== this is really odd 
     std::cout << "all characters read successfully."; 
    else 
     std::cout << "error: only " << is.gcount() << " could be read"; 
    is.close(); 

    // ...buffer contains the entire file... 

    delete[] buffer; 
    } 
    return 0; 
} 
+1

請在這裏閱讀:http://en.cppreference.com/w/cpp/io/basic_ios/operator_bool –

+0

謝謝,我用谷歌搜索和在cplusplus.com,但我沒有找到有意義的結果。 – Aminos

+1

您應該更好地使用鏈接的參考。 cplusplus.com因缺陷,錯誤或缺失信息而出名。 –

回答

2

operator bool() 

返回true,如果流沒有錯誤,錯誤o therwise。

無錯誤」的概念與之前在流本身上完成的操作有關。

例如:調用構造

std::ifstream is ("test.txt", std::ifstream::binary); 

在流對象A的內部狀態標誌被設置之後。因此,當您調用運營商bool時,請檢查施工操作是否失敗。

此外,該方法

is.read(...) 

還設置這種內部狀態標誌,你可以在reference看到:

錯誤是通過修改內部狀態的標誌信號:eofbitfailbitbadbit

所以方法調用之後,如果流到達EOF(結束文件)中的狀態位被置位,並且操作者布爾將返回一個正值。

這意味着在這種情況下,當你與

if (is) { ... } 

測試流和狀態位,則條件將被驗證,如果-分支將被採用。

+1

很好的解釋!謝謝 ! – Aminos

3
if (expression) 

測試中,它expression計算爲true這是一個布爾值。它適用於指針,因爲nullptr/NULL/0評估爲false,以及其他所有內容true。它出於同樣的原因用於整數值。

對於一個對象,它落入operator bool(),見http://en.cppreference.com/w/cpp/io/basic_ios/operator_bool

檢查流是否沒有錯誤。

1)如果fail()返回true,則返回一個空指針,否則返回一個非空指針。該指針可以隱式轉換爲布爾值,並可以在布爾上下文中使用。

2)如果流沒有錯誤並準備好進行I/O操作,則返回true。具體而言,返回!fail()。

該運算符可以使用返回對流作爲循環條件的引用的流和函數,從而產生慣用的C++輸入循環,例如while(stream >> value){...}或while(getline(stream ,string)){...}。

僅當輸入操作成功時,此類循環纔會執行循環的主體。

+0

很好的解釋。謝謝。 – Aminos

1

std::istream有運營商宣佈正確的: explicit operator bool() const;

當你寫 if(SomeStdIstremObject) { ... }真的呼籲if(SomeStdIstreamObject.operator bool())不檢查非零