K R學習筆記 第七章

2021-06-17 18:37:58 字數 1785 閱讀 9987

這一章講i/o。

i/o本來是與作業系統高度相關的內容,但是這一章,卻從標準庫的角度,介紹了如何使用i/o。而把i/o的一些具體實現細節留在了最後一章中。

首先需要注意的是,標準庫中的許多「函式」,都是巨集,比如getchar、putchar()、tolower()等等。這樣做的目的是為了減小函式呼叫的開銷,想想也是,這些「函式」是對單個字元進行處理的,而計算機的輸入動輒上萬個字元,所以這樣設計,還是可以看出大牛們的**遠矚。

然後介紹一下已經用爛了的printf()函式,需要注意的是printf的返回值:列印字元的個數。與printf相似的,還有sprintf,它將格式化的字串列印到第乙個引數指定的字串中。

函式的特別之處在於變長參數列,(我們以前遇到的函式引數個數、型別都是一定的)書中通過乙個例子來說明了這個問題:

#include #include void minprintf(char *fmt,...);

int main(int argc, char* argv)

void minprintf(char *fmt,...)

switch(*++p)

}va_end(ap);//結束呼叫清理

}

對於沒有名字的參數列,stdarg.h中的一組巨集定義了何如使用它們。

首先,使用va_list型別宣告乙個變數,稱為引數指標。這個變數將依次引用各個引數。使用時通過va_start初始化,將最後乙個有名引數作為ap的起點;

通過呼叫va_arg,將返回乙個引數,並將ap指向下乙個引數。va_arg需要乙個引數來確定返回物件的型別以及指標移動的步長。

結束時通過va_end巨集釋放資源。

與printff相對應的scanf。它接受乙個格式的字串輸入,並按照格式將它儲存最對應的引數中。當掃瞄完所有字元或者遇到格式不匹配時,scanf將停止工作,將返回成功匹配並賦值的輸入項個數。如果遇到eof,則返回eof;如果全部匹配,則返回匹配的變數的個數。注意scanf將忽略空格符和製表符,在讀入輸入值時,會跳過各種空白符(空格、製表、換行)

除了跟標準io互動以外,其實更多的時候,我們需要跟檔案互動,這時就需要使用file型別的指標和fopen函式了。

fopen比較簡單,引數是開啟檔案的位置和訪問模式:讀("r")、寫("w")、追加("a")。需要注意的是,如果開啟乙個不存在的檔案,或者用不正確的模式開啟檔案(比如有的檔案時唯讀的,但你想寫或者追加),那麼fopen返回null;如果以w方式開啟乙個檔案,原有的內容將被覆蓋;如果以a方式開啟,那麼原有內容將保持不變。

其中file型別中包含了很多內容,包括緩衝區的位置、緩衝區中當前的位置、檔案的讀或寫狀態,是否出錯,或者是否達到檔案結尾等等。因為有了緩衝區中當前的位置,我們才可以使用getc函式從檔案中返回下乙個字元。同理,我們也可以使用fscanf或者fprintf來向檔案格式化輸入或者輸出。

需要注意的是,當啟動乙個c程式時,系統已經自動開啟了3個檔案,stdin、stdout和stderr,其中stdin指向鍵盤;而後面兩個指向顯示器。下面通過乙個將多個檔案的字元連著列印出來來說明這個問題:

int main(int argc, char* argv)

else

}} if(ferror(stdout))//如果流出錯,將會返回非0值

exit(0);

}void filecopy(file *ifp, file *ofp)

注意到,我們使用了fprintf將錯誤資訊輸出到螢幕上,而不是輸出到檔案或者管道中;在程式末尾,通過ferror(stdout)來檢查stdout是否出錯(雖然這種出錯的機率很小)。

第七章筆記

程序就是cpu未完成的工作 檢視程序的相關命令 ps a 關於當前環境的所有程序 x 與當前環境無關的所有程序 f 顯示程序從屬關係 e 顯示當前使用者環境中的所有程序 l 長列表顯示程序的詳細資訊 u 顯示程序的使用者資訊 ps ax o cpu,mem,user,group,comm,nice,...

C primer plus 學習筆記(第七章)

第七章 函式 c 的程式設計模組 7.3.5 指標和const 前提 int grop 16 int chips 12 const int p snack gorp const會鎖定後面乙個符號,所以,此時 p snack chips allowed p snack 20 error前提 int g...

C Essential c 第七章學習筆記

第七章主要介紹了如何使用異常來使你的程式更安全。2.2 throw 2.3 沿著函式呼叫鏈上傳 2.4 異常的處理流程 3.標準異常 4.區域性資源管理 丟擲int 例一 丟擲int voidf1 int num,int max 50 丟擲string,注意,catch解析這個錯誤的時候,使用con...