2010-09-15 22 views
3

可以說,我的程序中有多個功能需要將數據附加到某個文件。我在程序開始時用全局文件句柄打開文件,以便在需要的地方添加它。 (請注意,我知道我可以將文件句柄作爲參數傳遞給函數,但這不是此問題的目的)。在程序開始時打開文件句柄並在最後關閉它是不好的;或者更好的辦法是讓一個函數void AppendFile(char *data_to_append);,然後打開文件並追加到它並關閉它在這個相同的功能?如果程序死了,FD仍然會被使用是我看到的唯一不好的事情,但同時,如果使用該功能,則會打開和關閉同一文件數百次和數百次。追加到全局文件句柄,它不好嗎?

+0

你聽說過'stdout'嗎?它是在啓動時(之前)創建的全局文件句柄,可供使用。 – 2010-09-15 18:36:16

+0

是的,我有,它已被用於其他事情。 – user318747 2010-09-15 19:11:01

回答

2

您可能最好做一個開放和一個關閉。打開/關閉不停會導致大量IO浪費。

儘管使用互斥鎖,您可能會希望保護此功能,因此一次只能有一個線程寫入文件句柄。

請確保儘管最終關閉了您的文件。

0

是的。

不是最有用的答案,但恐怕你的問題太籠統和模糊,無法給你詳細的解答。如果你有通過你的程序分散訪問這個FD,那麼它表明你的高級設計有問題。這些分開的訪問是否以某種方式相互關聯?他們可以合併成更少的訪問該文件的點數?你的程序中是否有某種隱含的數據結構可以更好地在課堂上實現?

+0

哇,課?標籤上寫着C. – nmichaels 2010-09-15 18:02:13

+0

當我回答時沒有發現/它不在那裏。我會留下評論,因爲每個人都知道,如果你有足夠的決心並缺乏正常的理智界限,C不會阻止你做OO ... – Amoss 2010-09-15 18:26:27

1

如果你的程序是單線程的,沒關係。如果它在文件句柄打開時死掉,它可能會被操作系統關閉。如果不是,那麼要保證它不會死在AppendFile函數中?

雖然我建議你做這個AppendFile函數。它將簡化寫入過程,並且與使用大量fwrite()相比,您可以更輕鬆地更改文件句柄的相關內容。

1

取決於您對文件的關注程度,而不會被丟棄或丟失數據。如果程序崩潰了,那麼還不能保證所有未完成的寫入(不是完成,而是刷新並提交到磁盤)發生什麼情況。如果有未提交的寫入,他們可能被拋出或半完成。關閉文件可以保證這些寫入被提交。

如果寫入不經常,打開/附加/關閉是一個更好的主意國際海事組織 - 但AppendFile可以使已經打開的文件句柄,所以它實際上更好地工作任何方式。

除此之外,如果你使用線程,你不想隨機寫入文件 - 你想有一些方法來同步它們。有一個AppendFile或類似的函數爲您提供了同步點 - 您可以在那裏添加代碼,直到另一個線程完成。當你直接在一百個不同的地方寫文件時,試着去做這件事。

+0

append/flush/append/flush會給你一個很好的保證,東西被寫出來。 – nmichaels 2010-09-15 18:04:40

+0

如果有人記得沖洗。他們很可能不會。另一個支持'AppendFile'的論點。 :) – cHao 2010-09-15 18:14:15

1

有時一個數據庫,它是文本文件的一個很好的替代品,expecially當數據庫是專門設計來取代在首位:)

看看的SQLite(http://www.sqlite.org/)的文本文件。的SQLite

覺得還不如甲骨文,但作爲fopen()函數

0

替換如果文件句柄你說的是FILE *然後在開始打開,並在年底有很多的關閉更換即使有多個線程,用戶也應該按預期工作,只要您在POSIX系統上使用單個stdio函數調用進行寫操作即可。

如果通過文件句柄表示操作系統的公開調用返回的整數,那麼這些通常在對write(或類似的)的單個調用中是線程安全的,因爲操作系統將鎖定文件,同時將數據傳輸到與該文件。

如果程序是單線程應用程序,那麼您無需擔心任何一種方式。

如果你去與反覆開,追加和關閉文件,你可以,如果使用標準輸入輸出的FILE *多線程或者如果AppendFile電話,因爲內的不同FILE * s就不能共享緩存不知何故遞歸製作陷入困境應用程序以及文件在一個線程中更改時,其他線程可能會覆蓋這些更改。

os文件句柄(打開時返回的整數)會發生類似的情況,因爲對open的不同調用將產生不同的文件句柄,而不會共享它們的查找位置,因此隨着文件增長,不同的文件描述符將最終結束搜索位置實際上並不在文件末尾,除非您可以在操作系統爲您處理此操作的情況下打開僅附加模式(O_APPEND)的文件。

反覆打開和關閉文件確實會產生很多額外的工作。

1

全局變量通常不是一件好事。對於小程序來說,這並不重要。

儘管仍在使用全局文件句柄,但請考慮只通過void AppendFile(char *data_to_append);函數來訪問它,其中只有AppendFile引用全局文件,而不是散佈在全部代碼中。

如果經常訪問文件,在每次訪問時打開/關閉文件都可能成爲惡意。另外,當你的程序結束時(通常死亡或正常退出),文件句柄通常是關閉的,所以如果程序崩潰,你不會泄漏任何東西。