5.1用setvbuf實現setbuf
void setbuf(file *stream, char *buf);int setvbuf(file *stream, char *buf, int mode, size_t size);
當buf為null,則為無緩衝,否則為全緩衝。
void my_setbuf(file *restrict fp, char *restrict buf)
5.2圖5-5中的程式利用每次一行i/o(fgets和fputs函式)複製檔案。若將程式中的maxline改為4,當複製的行超過該最大值時會出現什麼情況。對此進行解釋。
fgets函式讀入資料,直到行結束或緩衝區滿(當然會留出乙個位元組存放終止null位元組)。同樣fputs只負責將緩衝區的內容輸出直到遇到null位元組,而並不考慮緩衝區是否包含換行符。所以,如果maxline設得很小,這兩個函式仍正常工作,只不過緩衝區較大時,函式被執行的次數要多於maxline值設定得較大的時候。5.3printf返回0值表示什麼
沒有輸出字元,即printf(「」);5.4下面的**在已寫機器上執行正確,而在另一些機器執行時出錯,解釋問題所在。
#include
intmain(void)
這是乙個比較常見的錯誤。getc以及getchar的返回值是int 型別,而不是char型別。由於eof經常定義為-1,那麼如果系統使用的是有符號的字元型別,程式還可以正常工作。但如果使用的是無符號字元型別,那麼返回的eof被儲存到字元c後將不再是-1,所以,程式會陷入死迴圈。5.5對標準i/o流如何使用fsync函式?
使用方法,先呼叫fflush後呼叫fsync(保證檔案系統與緩衝區內容的一致性)。fsync所使用的引數由fileno函式獲得。如果不呼叫fflush,所有的資料仍然在記憶體緩衝區中,此時呼叫fsync將沒有任何效果。示例**:
#include "apue.h"
int fsync_streamaa(file *);
int main(void)
fprintf(fp, "as i lay dying");
fsync_streamaa(fp);
_exit(0);
}int fsync_streamaa(file *fp)
使用自定義的fsync_streamaa函式之後,可以在fopen的檔案中看到寫入的內容,而將fflush注釋掉時,fopen的檔案無內容。
ps:exit與_exit區別:exit直接使程序停止執行,清除其使用的記憶體空間,並清除其在核心的各種資料結構;exit 函式則在這些基礎上做了一些小動作,在執行退出之前還加了若干道工序。exit() 函式與 _exit() 函式的最大區別在於exit()函式在呼叫exit 系統呼叫前要檢查檔案的開啟情況,把檔案緩衝區中的內容寫回檔案。也就是「清理i/o緩衝」
5.6在圖1-7和圖1-10程式中,列印的提示資訊沒有包含換行符,程式也沒有呼叫fflush函式,請解釋輸出提示資訊的原因是什麼?
標準輸入和標準輸出均為行緩衝方式,fgets每次呼叫stdin均會沖洗緩衝區。
第五章習題
一 填空題 1 c 的兩種聯編方式為 靜態 聯編和 動態 聯編。2 c 支援兩種多型性,靜態聯編所支援的多型性被稱為 編譯時的多型性 動態聯編所支援的多型性被稱為 執行時的多型性 3 過載函式在編譯時表現出多型性,就是 靜態 聯編 而虛函式則在執行時表現出多型性是 動態 聯編。4 為了區分過載函式,...
C 第五章習題
1 將例5.1的程式片段補充和改寫成乙個完整 正確的程式,用公用繼承方式。在程式中應包括輸入資料的函式,在程式執行時輸入num name age addr的值,程式應輸出以上五個資料的值。class student 宣告基類 void student get value void student d...
C 第五章 習題
p162 5.18 編輯乙個學生和教師資料輸入和顯示程式,學生資料要編號 姓名 班號和成績,教師資料有編號 姓名 職稱和部門。要求將編號 姓名輸入和顯示設計成乙個類person,並作為學生資料操作類student和教師資料操作類teacher的基類。include includeusing name...