情況說明
最近在寫一個操作文件的函數(shù),使用fseek()函數(shù)定位到文件某個位置,然后用fwrite()重新更新該位置的內(nèi)容,發(fā)現(xiàn)該位置處的內(nèi)容并沒有更新,反而更新的內(nèi)容竟然出現(xiàn)在了文件末尾,真的是不知道什么情況。
問題復(fù)現(xiàn)
下面先簡單復(fù)現(xiàn)我所遇到的問題吧,示例代碼如下:
/* *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; }
將上述代碼編譯,然后在編譯輸出文件所在的文件夾中創(chuàng)建一個test.txt文件,內(nèi)容為:
123456789abcdef
2019-01-24_185403
2019-01-24_185449
接著運(yùn)行程序,打開test.txt,可以看到內(nèi)容(字符W)被寫到文件的末尾了:
2019-01-24_185803
2019-01-24_185815
原因分析
這是什么情況,明明使用fseek定位到文件的開頭了,但是實(shí)際卻寫入到了文件末尾,好吧,當(dāng)時我也是挺困惑的,難道是寫fseek()接口函數(shù)的哥們還遺留有什么bug。后來上網(wǎng)查證,發(fā)現(xiàn)這是我們打開文件的所使用的模式"a+"在作怪。下面看看對該模式的描述,直接在終端輸入:man fopen:
2019-01-24_190507
其中對fopen()函數(shù)涉及的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+模式的描述大致內(nèi)容是:打開一個文件,如果該文件不存在將創(chuàng)建文件,初始化的文件讀指針位于文件的開頭;對于文件的寫操作,則始終將寫入內(nèi)容追加到文件的末尾,與文件指針沒有關(guān)系。
想必看到這里,大家也明白了。如果想使用fseek()函數(shù)定位寫操作指針,那么就修改fopen()涉及的模式,這里修改為"r+",就能實(shí)現(xiàn)將內(nèi)容寫到文件的開始了,對于自己的程序大家還是根據(jù)實(shí)際情況修改為相應(yīng)的模式。
審核編輯:劉清
-
C語言
+關(guān)注
關(guān)注
180文章
7631瀏覽量
141187
原文標(biāo)題:C語言-fseek不起作用,寫操作定位無效
文章出處:【微信號:嵌入式那些事,微信公眾號:嵌入式那些事】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
評論