[問題] fopen與fclose

看板C_and_CPP作者時間15年前 (2010/11/03 11:29), 編輯推噓6(608)
留言14則, 6人參與, 最新討論串1/1
遇到的問題: (題意請描述清楚) 如果用了fopen函式開啟檔案,一般來說在檔案寫入或讀取結束後都應該用fclose關閉檔 案,但是最近在看一些範例程式的時候,發現在開啟多個檔案時,如果有任何一個沒有成 功開啟,都是直接return,這樣的作法是否會產生任何可能的錯誤? 舉例來說: int main() { FILE *file1 = fopen(argv[1], "r"); if(!file1) return 1; FILE *file2 = fopen(argv[2], "rb"); if(!file2) return 2; FILE *file3 = fopen(argv[3], "w"); if(!file3) return 3; FILE *file4 = fopen(argv[4], "wb"); if(!file4) return 4; ... fclose(file1); fclose(file2); fclose(file3); fclose(file4); } 如果在開啟*file3的階段失敗,程式直接脫離main,但是並未將*file1及*file2關閉。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 203.67.181.135

11/03 11:55, , 1F
main結束的時候會把所有已經開啟的檔案關閉
11/03 11:55, 1F

11/03 11:56, , 2F
如果這邊不是 main 而只是普通 function 的話就炸囉
11/03 11:56, 2F

11/03 11:58, , 3F
改用 C++ 的 ifstream,在離開 function 時會呼叫 dtor
11/03 11:58, 3F

11/03 11:58, , 4F
並確保檔案會關閉,這是比較好的解決方式
11/03 11:58, 4F

11/03 15:37, , 5F
就算在function裡沒關閉,在exit()裡也會關阿
11/03 15:37, 5F

11/03 16:21, , 6F
這和memory leak是同樣的意思啊,程式結束記憶體會回收
11/03 16:21, 6F

11/03 16:21, , 7F
並不表示 malloc 完我們都不用 free...
11/03 16:21, 7F

11/03 16:39, , 8F
用malloc後free掉的記憶體還是可讀可寫吧???
11/03 16:39, 8F

11/03 17:06, , 9F
我還是第一次聽說free後記憶體還能隨便給你讀寫的...
11/03 17:06, 9F

11/03 17:09, , 10F
丟到 codepad 就錯給你看了呀 XD
11/03 17:09, 10F

11/03 17:22, , 11F
是可讀可寫沒錯 不過發生什麼事沒人能保證 XDDDDD
11/03 17:22, 11F

11/03 17:32, , 12F
執行free後,那個區塊如果還在的話就行
11/03 17:32, 12F

11/03 17:47, , 13F
也可以用malloc來動態產生程式碼來執行吧
11/03 17:47, 13F

11/03 18:08, , 14F
理論上可以但請考慮到 OS 對 Memory 有沒有保護機制
11/03 18:08, 14F
文章代碼(AID): #1CqDSmxr (C_and_CPP)