史萊姆論壇

史萊姆論壇 (http://forum.slime.com.tw/)
-   程式語言討論區 (http://forum.slime.com.tw/f76.html)
-   -   請問資料流開啟檔案判斷是否成功 (http://forum.slime.com.tw/thread222219.html)

a19870504 2007-12-17 10:45 PM

請問資料流開啟檔案判斷是否成功
 
書上這一部份小弟又沒用了 我看不懂他的意思 :on_51: 對不起請容我在發問

fstream FileInput(FileNameIn, ios::in)
if (!FileInput)
{
cout << "檔案" << FileNameIn
<< "開啟失敗! << endl;
exit(1);
}

可以請問一下為什麼判斷是否成功的條件式會是 !FileInput
! 不是相反地意思嗎?? (就是除了它以外)
書上的說明我也看不懂 什麼成功ture會傳回1 不明白他的語意
奇摩知識也找不到 請賜教 :on_74:

mini 2007-12-17 11:01 PM

這一行 fstream FileInput(FileNameIn, ios::in)
一下子做了兩件事
1. 宣告一個 fstream型態的 物件變數,其名稱是 FileInput
2. 開啟 FileNameIn檔案

利用 FileInput來判讀是否為 0 (檔案開啟失敗 的話 FileInput會等於 0)
if (!FileInput) 翻譯過來就是
如果 FileInput等於零 則失敗

a19870504 2007-12-18 07:28 AM

那為什麼會是用指標名稱來判斷是否為0或1
是只要開豈不成功此檔案就會傳遞一個非0的訊息給系統
然後我們在利用這個訊息來寫條件式??

然後檔案開豈不成功所以訊息會是1在給EXIT這個函數而結束動作??


那這樣的話可以單寫成 if( !0 ) 嗎?

還有到底成功的訊息是會傳0還是1 課本一下說0一下說1 我好槁不懂

mini 2007-12-18 08:23 AM

FileInput 被宣告成一個 fstream(檔案流)物件變數
並不是一個指標不指標的關係

所謂 物件 有點像 class
但 物件 本身就是一個容積 (class 就要用 . 來存取內部成員資料)
舉個例
物件A 可以 if(物件A==1){...}
類別B 就需 if(類別B.err>0){...}

a19870504 2007-12-18 11:49 AM

MINI大哥 我看書上是說 ture為1 flast 為0 還是書上寫錯阿??
因為LINUX也是0為ture

這是小弟早上思考出來的理解方式 不知道這樣算不算對

就是當開啟檔案時有開啟動作所以資料流會存為1 或是想成預設情況下就是1

但是最後開啟失敗資料流要傳回非0的訊息給系統 就利用!(想成資料流預設為1)

剛好府合條件非1的值 所以執行 if 條件式

最後exit() function 要結束此開啟檔案的動作 書上是寫exit(1)

就是資料流代表1所以看成結束資料流目前的動作(開啟檔案)

可以想成這樣嗎 因為這是我想了一個早上感覺我可以懂又滿合理的說法 :on_44:

mini 2007-12-18 01:56 PM

引用:

作者: a19870504 (文章 1861464)
MINI大哥 我看書上是說 ture為1 flast 為0 還是書上寫錯阿??
因為LINUX也是0為ture

這是小弟早上思考出來的理解方式 不知道這樣算不算對

就是當開啟檔案時有開啟動作所以資料流會存為1 或是想成預設情況下就是1

但是最後開啟失敗資料流要傳回非0的訊息給系統 就利用!(想成資料流預設為1)

剛好府合條件非1的值 所以執行 if 條件式

最後exit() function 要結束此開啟檔案的動作 書上是寫exit(1)

就是資料流代表1所以看成結束資料流目前的動作(開啟檔案)

可以想成這樣嗎 因為這是我想了一個早上感覺我可以懂又滿合理的說法 :on_44:

真不好意思
之前搞錯了 (前面的回覆都改了)

總之 FileInput 執行開檔動作後
會得到一個返回值
用這個返回值是否為零
就知道是否開啟成功就對了
(為零 就是失敗)

一般程式語言的布林設計是
不為零 就是 True
為零 就是 False

所以 !0 會變成 True

joebin 2007-12-20 11:55 PM

我來進行所有統整解釋吧


Q1:為什麼判斷是否成功的條件式會是 !FileInput??
A1:因為FileInput是你函入文件檔時的輸入指令(請看以下例子)
語法:

int main(){  //從主函式開始
  int n;
  ifstream fin("in.txt");
  ofstream fout("out.txt");
  fin >>n;
  fout <<n+1;
  return 0;
}

以上面的主函式來說明

1.藍色部分C/C++裡面是執行函入和輸出的固定程式碼

2.綠色部分則是依照你給定的變數作為指令在運用,好比說cout好了,cout 的定義為"輸出",則在上面各綠色部分的"fout"是個人設"fout"這個變數去充當輸出的指令,也就是說只要我把cout改成fout,則該輸出將會輸出於我要的文件"out.txt"裡,fin也是如此,把cin改成fin則會從我選定的文件輸入,假如你把ifstream fin("in.txt");這段改為ifstream f("in.txt");,則表示你設"f"這個變數作為檔案輸入的指令

3.紅色部分為你要函入或輸出的文件擋,一定要附上附檔名,若存放位置不在debug這個資料夾裡,則要註明從哪輸入(當你開一個文件檔時,上頭不是有欄文件檔的存放位置,把那欄複製貼在紅色部分前面即可)


Q2:為什麼會是用指標名稱來判斷是否為0或1??
A2:因為電腦的世界中只有0或1在跑(有電流經過或無電流經過),至於0和1的運用
語法:

int a;
cin >>a;
if((a%=2))
  cout  a*2;
return 0;

就以上指令而言,若a%2=1(a為奇數),則會進入藍色部分的步驟,若a%2=0,則不會進入,為何呢??因為在電腦世界中,0代表false,1代表truth,在執行藍色部分之前會先經過if的條件式判斷,if這個指令要進行其子函式(藍色部分)前,必須得到truth的回應才會執行,也就是說若if (!FileInput)要執行其子函式,則需!FileInput為truth,但又"!"有否定意味在,所以FileInput的值要為false(0),也就代表沒有輸入才會執行if的子函式


以上,了解嘛??


所有時間均為台北時間。現在的時間是 11:08 PM

Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.

『服務條款』

* 有問題不知道該怎麼解決嗎?請聯絡本站的系統管理員 *


SEO by vBSEO 3.6.1