• 2

請問 C++ 的 ifstream

聽說這裡神人比較多

如下的語法 :

ifstream InputFile;
InputFile.open("c:\\test.txt");

if ( !InputFile ) {
cout << "Error" << endl;<br>}

問題:
if 裡面若是寫 InputFile.fail() 這能理解, 因為這函數會傳回 bool
但更多人寫的是 if ( !InputFile ) , 這就不理解了, InputFile 是個物件
為什麼能寫 !InputFile 成為個 bool ?

謝謝

----------------

而且若我宣告個 bool b1;

b1 = InputFile;

錯誤 C2440 '=': 無法由 'std::ifstream' 轉換為 'bool'
從 "std::ifstream" 到 "bool" 之間沒有合適的轉換函式存在


但寫 b1 = !InputFile; 確又可以通過編譯

-----------------

我發現這二行所生成的 ASM 代碼是一樣的

if ( !InputFile )
if ( InputFile.fail() )

我的疑問是 InputFile 單純是個物件變數, 為何加個 ! 他就變成呼叫 InputFile.fail()
我想了解這招是 C++ 的那個機制 or 觀念。
2017-09-06 10:20 發佈
文章關鍵字 C++ ifstream
jimmypp wrote:
聽說這裡神人比較多...(恕刪)


因為驚嘆號應該是邏輯的not,但是也代表著反函數運算,
所以數值如果最後運算出來不是0,那麼也就成立了,
當不是0時,又假如是0 or 1時,這時候引數進去可以對等於布林函數...
所以...!一個變數時,是可以用if來判別的....
以上....應該是這樣吧??

hchou38 wrote:
因為驚嘆號應該是邏...(恕刪)


應該不是這樣
我發現這二行所生成的 ASM 代碼是一樣的

if ( !InputFile )
if ( InputFile.fail() )

我的疑問是 InputFile 單純是個物件變數, 為何加個 ! 他就變成呼叫 InputFile.fail()
我想了解這招是 C++ 的那個機制 or 觀念。
jimmypp wrote:
應該不是這樣...(恕刪)


我覺得真的沒那麼複雜,
是您想複雜了....我直白的舉個例子,雖然我不是專家.

例~EX
假如 (小潔是女生) 並且 (身高) 並且 (笑起來有酒窩)
{
那是我....
}
否則
{
那不是我.....
}

所以if假如的判斷.未必一定得是真或假的.只要有數值,其實也是成立的.
我想您的問題根本道理也是這樣....

hchou38 wrote:
我覺得真的沒那麼複...(恕刪)


我想你誤解我的問題了,不過還是要謝謝你。

c++ 的 operator
jimmypp wrote:
聽說這裡神人比較多...(恕刪)
其實 ifstream 的本質是void*, 當open還沒下或是開的檔案不存在時, InputFile的值是null(0), 所以可以用 if(!InputFile)

jimmypp wrote:
而且若我宣告個 bool b1;
b1 = InputFile;
錯誤 C2440 '=': 無法由 'std::ifstream' 轉換為 'bool'
從 "std::ifstream" 到 "bool" 之間沒有合適的轉換函式存在
但寫 b1 = !InputFile; 確又可以通過編譯


我用VC++沒有這個問題, 會有warning, 但是不至於compile不過

jimmypp wrote:
我發現這二行所生成的 ASM 代碼是一樣的
if ( !InputFile )
if ( InputFile.fail )
我的疑問是 InputFile 單純是個物件變數, 為何加個 ! 他就變成呼叫 InputFile.fail
我想了解這招是 C++ 的那個機制 or 觀念。


應該不是事實, fail還是個function, 傳回true或false, 而InputFile本質是void*所以可以用if判斷式(就像int一樣)
jimmypp wrote:
聽說這裡神人比較多...(恕刪)


老師沒解釋的話問老師。 要不然你基本概念都沒有,會越來越慘。

你懂不懂
boolean (true, false)
pointer (memory address, NUL/NULL)
int 0, 1

這三個用if的時候是甚麼結果? 為什麼會有這種結果? 這要好好了解。。。。。

if (!NULL)
if (!false)
if (!0)

ifstream.open 成功的話得到甚麼? 不成功的話pointer會指向哪裡?

從你的問題就知道你的一些基本概念還沒有懂,地基沒打好,不要蓋上去,要不然越來越危險。
*我不是神人 我是神經病*
*我不是神人 我是神經病*
*我不是神人 我是神經病*

ifstream InputFile;

你宣告了一個變數 InputFile

InputFile.open("c:\\test.txt");
你呼叫 open 函數, 但是其實他有傳回值

if ( !InputFile ) {
cout << "Error" << endl;
}

你可以用 .fail() 去檢查傳回值, 但, 如果這個物件一開始就沒被初始化或構成...你想得到程序崩潰請呼叫 NULL.fail();
  • 2
內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?