2016-02-16 52 views
2

在cplusplus.com給出一個例子:不明白的IStream cplusplus.com例如::閱讀

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

是否有人可以解釋爲什麼在過去if (is)能夠確定是否所有的字符已經讀?如果我們已經存在的聲明和我解釋它的方式(可能太簡單和錯誤),我們只檢查是否存在,但不是已經建立?

+2

這是'std :: basic_istream'轉換爲布爾值的語義的一部分。請參閱本頁底部的表格以瞭解詳細信息http://en.cppreference.com/w/cpp/io/basic_ios/operator_bool – StoryTeller

回答

3

std::ifstream具有轉換操作員bool,它返回是否badbitfailbit被設置在流上。

它實質上是if (!is.fail()) {/*...*/}的簡寫。

+0

好的,如果我理解正確,'is'是一個對象,其中有標誌參數可以打開和關閉的布爾形式。執行is.read()時,會在流中遇到問題時引發標誌,隨後可以通過執行if(is)來檢查標誌。因此,雖然操作看起來與先前的操作是否相同,但'is'的狀態可能在此期間發生了變化? – Omnia87

+0

@ Omnia87是的,國家可能已經改變,因此額外的檢查。 – TartanLlama

1

std::ifstream定義operator bool() const,它隱式地將流轉換爲布爾值。

從cplusplus.com上操作者布爾():錯誤標誌

返回是否被設置(無論是failbit或badbit)。

請注意,這個函數不會像成員一樣返回相同的成員,但 與成員相反失敗。

http://www.cplusplus.com/reference/ios/ios/operator_bool/