fgetc庫函式使用

2021-06-13 03:26:03 字數 1041 閱讀 5704

fgetc函式從檔案流裡取出下乙個位元組並把它作為乙個字元返回。當它到達檔案尾部或者出現錯誤時,它返回eof。怎麼區分這兩種情況呢?用ferror或feof來判斷。(這段話來自經典書籍linux程式設計)。

int c;

while((c = fgetc(fp)) != eof)

fputc(c, out);

if(!feof(fp)) // ferror(fp), 這裡判斷

如果有人這麼寫:

while(!feof(fp))

這個就有問題了。如果fgetc讀完最後乙個字元後,feof(fp)依然返回0(沒有結束)。只有再fgetc(fp)一次後,feof(fp)才為非零。這樣的話,對於後面這段**,最後一次while迴圈時,fgetc取出來的是-1(eof)。這個我試驗了。所以對於第一段**,一定要注意後面的判斷;第二段**是錯誤的。

fgetc/fputc函式處理時,由於file結構內部帶有緩衝,等這個緩衝滿時才真正呼叫系統呼叫寫到檔案。那麼如果我想驗證這個內部緩衝有多大,用什麼辦法好呢?我剛才實驗了個辦法:乙個執行緒呼叫fputc往裡寫,另外乙個通過read讀取,看第一次read成功時,讀出多少字元。這個想法有個假設:乙個執行緒不斷的fputc往檔案寫,一旦填滿內部緩衝,就要寫到檔案,這時另外乙個阻塞在read那裡的執行緒馬上讀出資料返回。但是這個假設不一定成了。從試驗結果看這個辦法不行。實驗結果:nread = read(fd, buf, sizeof(buf); nread始終等於buf的size。還有沒有其它辦法呢?在網上沒有找個好辦法。回頭好好想想。

剛才想到個辦法:用strace工具檢視系統呼叫次數。從檔案中fgetc字元。當讀取個數<=4096時,只有1次read系統呼叫,而讀取4097個字元時,有2次read系統呼叫。由此可斷定我的系統中file內部緩衝是4096位元組。

庫函式的使用

itoa atoi strrev函式的使用 atio 把字串轉換成整型數 stdlib.h itoa 將任意型別的數字轉換為字串,itoa int a,char s,c a被轉換的整數,s轉換後儲存的字元陣列,c轉換進製數 strrev 把字串s的所有字元的順序顛倒過來 不包括空字元null str...

LCD庫函式使用

博主本人之前一直使用的是f10系列的stm32晶元,這次專案需要用到lcd顯示,故選用了stm32的l053晶元其io口自帶lcd驅動功能。使用新的一款晶元,首先當然是下官方手冊 官網英文版過於簡潔,中文版的比較適合初學者 然後找相似例程進行分析。當然關於lcd顯示的原理,這裡就不過多贅述了,我之前...

fputc和fgetc的使用

int fputc int ch,file stream 向檔案中寫字元 int fgetc file stream 從檔案中讀字元 注意 1 fputc 函式的引數是 int ch,但是傳入的時候需直接傳入字元 2 fgetc的返回值是int 一定不要弄錯了。如果換成char會容易誤判 首先明白三...