四十四 小心使用feof

2021-06-20 03:31:52 字數 1230 閱讀 4115

示例程式如下:

main()

fclose(fp);

}檔案file的內容如下:

hello world first

hello world second

程式的執行結果如下:

the file point before fgets is 0

the file point after fgets is 18

hello world first

the file point before fgets is 18

the file point after fgets is 37

hello world second

the file point before fgets is 37

the file point after fgets is 37

hello world second

為什麼會出現兩個"hello world second"呢?下面分析原因:

在分析之前,先看一下feof的解釋: feof () 是乙個檢測檔案是否結束的巨集,當檔案的結束標誌被置位時,再次對檔案進行任何讀操作,都將返回此標誌,直到使用rewind () 或關閉檔案為止。同時,每一次輸出都會使feof() 標誌失效。

那什麼時候,檔案的結束標誌才會置位呢? 通過測試,我發現,

當檔案當前指標位於檔案末尾時(相當於fseek(fp,0,seek_end))

,此時如果

再執行一次讀操作,

檔案結束標誌就會被設定

(結束標誌位於file結構中)。

fseek(fp,0,seek_end);

printf("the file point is :%d\n",ftell(fp));

printf("%c\n",fgetc(fp)); //if not do read operation, the end of file flag is not set

if(feof(fp))

printf("file end\n");

else

printf("not reach file end\n");

如果將上面的fgetc(fp)去調,就會發現顯示的是"not reach file end"

現在回過來說,為什麼出現兩次「hello world second」。那是因為檔案結束標識沒有設定,而s指向的緩衝區儲存了上次讀的內容。當第三次讀時,於是輸出了上次的快取區內容,此時檔案結束標誌設定,於是退出了迴圈。

加密函式(四十四)

下面我們來看一下最後一類函式,加密函式,這裡我們只羅列了兩個。1 md5 函式 實際上md5不能叫加密函式,更確切應該是摘要演算法,那麼具體什麼是摘要演算法,什麼是加密,大家感興趣的可以自己了解一下。下面我們簡單的演示一下,比如我們輸入select md5 admin 我們對admin進行一下加密。...

C 之四十四 滑鐵盧戰役

告訴學生們與玩家和計算機所做的移動有關的資訊可以儲存在名為a的3 3的陣列中。3 3陣列中的每個元素將表示戰場中的方格,如下圖所示。a 0,0 a 0,1 a 0,2 a 1,0 a 1,1 a 1,2 a 2,0 a 2,1 a 2,2 對於每個陣列元素的單元格 最初,值0被儲存到所有陣列元素中。...

愛情四十四課,他人的經驗

只活在別人的經驗裡不是強大的,只有自己敢於做,敢於總結,才能把經驗變成有力量的行為。所以,善用他人經驗的前提是,你有自己的經驗,並且先善對自己。看他人的經驗,重點是看對方如何選擇,接納事情的角度,以及心情的表達,而不是結果。比如同時意外成為 小三 的局面,看別人的故事,不是看對方結局怎麼樣,分手啦?...