C語言 fwrite 覆蓋檔案原始資料問題

2021-07-30 22:13:01 字數 576 閱讀 5094

最近在整專案時發現向檔案中嵌入資料時,資料會丟失,但是server端明明寫入成功了,但是client端在接收時顯示原來應該有資料的位置,什麼都沒有。期初懷疑是後來的資料覆蓋了前面寫入的資料,結果經過diff返現,應該有資料的位置壓根沒被改動過。

step 1:可能是快取的問題,所以在fwrite之後用了fflush方法,清空下快取。結果沒什麼用。

step 2:可能是緩衝區的問題,所以用setbuf 和setvbuf方法設定自己的緩衝區。結果依然沒什麼用。

這裡提到了 fflush()只保證了將io緩衝寫入系統緩衝中,使io讀操作能成功,但系統什麼時候寫入磁碟,由系統決定

所以這裡在fwrite之後要強制將資料寫回檔案中,也就是用如下方法(基於linux系統下)

#include

int fd = fileno(fp); //獲取檔案描述符

fsync(fd); //強制寫硬碟

最終順利解決了問題

ps:後來測試發現,不同的sd卡也會對程式的執行有影響,好在大部分sd卡都是可以的,只有極少數廠商的sd卡會出現問題。

C語言檔案操作之fread與fwrite

fread與fwrite都是以二進位制形式讀取和寫入檔案中的資料 1 函式原型 int fread void buffer,unsigned sife,unsigned count,file fp 2 功能說明 從由fp指定的檔案中,按二進位制形式將sife count個資料讀到由buffer指出的...

C語言fwrite函式了解

fwrite 函式 write data to a stream 原型 size t fwrite const void buffer,size t size,size t count,file stream 注意 這個函式以二進位制形式對檔案進行操作,不侷限於文字檔案 demo cpp view ...

c語言fwrite函式的總結

標頭檔案 include 函式原型 size t fwrite const void buffer,size t size,size t count,file stream 引數 size 要寫入內容的每個資料項的位元組數,單位是位元組 count 要寫入count個資料項,每個資料項size個位元...