2012-11-21 39 views
2

平臺是ARM上的Ubuntu Linux。 我想寫一個字符串到一個文件,但我想每次都截斷文件,然後寫入字符串,即沒有附加。用fopen打開的文件ftruncate

我有這樣的代碼:

f=fopen("/home/user1/refresh.txt","w"); 
fputs("{"some string",f); 
fflush(f); 
ftruncate(fileno(f),(off_t)0); 
flcose(f); 

如果我運行它,然後檢查文件,這將是零長度和打開時,會出現什麼也沒有。 如果我刪除fflush調用,它不會是0(將是11),當我打開它時,會出現「一些字符串」。 這是正常的行爲? 我沒有問題調用fflush,但我想在循環中執行此操作,並調用fflush可能會大大增加執行時間。

+0

如果不刷新緩衝區,它可以發生,這只是對'fclose'通紅,截斷後。 –

回答

2

如果你想字面意思是「截斷文件然後寫」,那麼它足以:

f=fopen("/home/user1/refresh.txt","w"); 
fputs("some string",f); 
fclose(f); 

打開文件中的模式w將截斷它(而不是模式a這是追加到結束)。

還呼籲fclose將刷新輸出緩衝器,沒有數據丟失。

+0

我想到了這一點,但我不能這樣做,該代碼將在一個循環中被調用,聽說打開和關閉文件是昂貴的操作,因此,它會引入延遲 – user1523271

3

你真的不應該混用文件句柄和文件描述符調用這樣。

什麼幾乎肯定發生沒有fflush是,some string在文件處理緩衝區等待傳遞到該文件描述符。然後截斷文件描述符,並關閉文件句柄,刷新字符串,因此它顯示在文件中。

隨着的fflush,some string發送到文件描述符和然後您截斷它。沒有進一步的刷新,文件保持截斷狀態。

+0

我能做些什麼,一個函數接受一個文件句柄,另一個需要描述符? – user1523271

+0

我能做些什麼,一個函數需要一個句柄,另一個需要描述符?至於事件序列,我認爲如果沒有「fflush」,「fputs」和truncate都會排隊,當文件關閉時1.字符串將被寫入,並且2.文件將被截斷。 – user1523271

+1

@ user1523271,這取決於你想達到的目標。有很多方法可以做到這一點,比如你有什麼或者用「w」模式關閉和重新打開。您應該將您的問題稱爲業務需求而不是技術選項。這樣,可能的解決方案數量就大大增加了。換句話說,退後一步,告訴我們你想實現而不是實現。_ – paxdiablo

2

POSIX要求您使用文件流和文件描述符訪問同一個打開的文件之間切換時採取的具體行動(這確保緩衝沒有醜陋的副作用,使你的程序就會失控)。這在XSH 2.5.1 Interaction of File Descriptors and Standard I/O Streams中描述。

就你而言,我相信只要在ftruncate之前撥打fflush即可,就像你在做的那樣。根據2.5.1的規則省略此步驟會導致未定義的行爲。

+0

由於我打電話給「fflush」,它會在時間上花費多少錢? – user1523271

+0

還沒有任何你想做的事情的基本成本。 –

相關問題