情況說明
最近在寫一個操作文件的函數,使用fseek()函數定位到文件某個位置,然后用fwrite()重新更新該位置的內容,發現該位置處的內容并沒有更新,反而更新的內容竟然出現在了文件末尾,真的是不知道什么情況。
問題復現
下面先簡單復現我所遇到的問題吧,示例代碼如下:
/* *By:AilsonJack *Date:2019.01.24 *Blog:www.only2fire.com *Des:fseek測試 */ #includeintmain(void) { char*fileName="test.txt"; charch='W'; FILE*fp=NULL; intiRet=0; fp=fopen(fileName,"a+"); if(!fp) { printf("open%sfailed! ",fileName); return-1; } iRet=fseek(fp,0,SEEK_SET);/*定位指針到文件頭*/ if(iRet0) ?{ ??printf("fseek?failed! "); ??fclose(fp); ??return?-1; ?} ?fwrite(&ch,?1,?1,?fp);?/*向文件中寫入單個字符?'W'*/ ?fclose(fp); ?return?0; }
將上述代碼編譯,然后在編譯輸出文件所在的文件夾中創建一個test.txt文件,內容為:
123456789abcdef
2019-01-24_185403
2019-01-24_185449
接著運行程序,打開test.txt,可以看到內容(字符W)被寫到文件的末尾了:
2019-01-24_185803
2019-01-24_185815
原因分析
這是什么情況,明明使用fseek定位到文件的開頭了,但是實際卻寫入到了文件末尾,好吧,當時我也是挺困惑的,難道是寫fseek()接口函數的哥們還遺留有什么bug。后來上網查證,發現這是我們打開文件的所使用的模式"a+"在作怪。下面看看對該模式的描述,直接在終端輸入:man fopen:
2019-01-24_190507
其中對fopen()函數涉及的a與a+模式的描述如下:
a:Open for appending (writing at end of file). The file is created if it does not exist. The stream is positioned at the end of the file.
a+:Open for reading and appending (writing at end of file). The file is created if it does not exist. The initial file position for reading is at the beginning of the file, but output is always appended to the end of the file.
上述對a與a+模式的描述大致內容是:打開一個文件,如果該文件不存在將創建文件,初始化的文件讀指針位于文件的開頭;對于文件的寫操作,則始終將寫入內容追加到文件的末尾,與文件指針沒有關系。
想必看到這里,大家也明白了。如果想使用fseek()函數定位寫操作指針,那么就修改fopen()涉及的模式,這里修改為"r+",就能實現將內容寫到文件的開始了,對于自己的程序大家還是根據實際情況修改為相應的模式。
審核編輯:劉清
-
C語言
+關注
關注
180文章
7630瀏覽量
140463
原文標題:C語言-fseek不起作用,寫操作定位無效
文章出處:【微信號:嵌入式那些事,微信公眾號:嵌入式那些事】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
評論