c primer plus(第五版)讀書筆計 第八章(1)

這一章比較的難懂因爲沒有什麼實例

單字符I/O:getchar()和 putchar ()

getchar () 和putchar()每次輸入和輸出一個字符。讀取從鍵盤輸入的字符並將其發送至屏幕。這個過程叫輸入回顯。

//8-1.c

#include <stdio.h>

int main (void)

{

char ch;

while ((ch = getchar (ch)) != '#')

putchar (ch);

return 0 ;

}

ANSI C將stdio.h頭文件與使用getchar()和putchar()相關聯,這就是我們在程序中將該文件包含在內的原因。

緩衝區:

在一些系統運行上面的程序時你輸入的文本立即回顯而有一些系統則在按回車前什麼都不會發生。輸入字符立即回顯是非緩衝或直接輸入的一個實例,它表示你所鍵入的字符對正在等待的程序立即變爲有用。相反延遲迴顯是緩衝的實例,這種情況下你鍵入的字符被收集並存儲在一個被稱爲緩衝區的臨時存儲區域中。按下回車可使您所鍵入的字符塊對程序變爲可用

 

8

爲什麼需要緩衝區?首先,將若干個字符作爲一個字符塊比逐個發送這些字符耗費的時間少。其次,可以修改錯誤的字符。

緩衝區分爲:完全緩衝和行緩衝。對完全緩衝輸入來說,緩衝區滿時被清空(內容被髮送到其目的地)。這種緩衝通常出現在文件輸入中。它的大小取決於系統,但512字節和4096字節是常見的值。對行緩衝來說,遇到一個換行時將被清空緩衝區。鍵盤輸入是標準的行緩衝,因此按下回車鍵將清空緩衝區。

終止鍵盤輸入:

文件,流和鍵盤輸入:

文件是一塊存儲信息的存儲器區域:通常文件 被保存在某種類別的永久存儲器上C語言具有許多用於打開,讀,寫和關閉文件的函數,在一個級別上它可以使用宋宿主操作系統的基本文件工具來處理文件 ,這被稱爲低級I/O因爲系統之間存在許多的差異,所以C還有第二種級別處理文件,稱之爲標準I/O包,這包括創建用於處理文件的I/O函數的標準模型和標準集,在這一高級別上系統之間的差異由特定的C實現處理,所以你與之打交道的是一個統一接口。

流:是一個理想化的數據流,實際輸入或輸出映射到這個數據流,這意味着具有不同屬性的多種類型的輸入由流表示,會具有更多統一的屬性。於是打開文件的過程就成爲將流與文件相關聯,並通過流進行讀寫的過程(C語言的I/O系統爲用戶提供了一個接口,該接口與實際的存取設備無關。只是設備的一個抽象表示形式。這個抽象的接口稱爲流,實際的設備稱爲文件。

C文件系統可以與各種設備一起使用,如打印機、硬盤、終端等,緩衝文件系統可以將每個設備轉換成邏輯設備,即所謂的流。所有的流工作方式類似,所以很容易操作不同的設備。流有2種類型:文本流和二進制流。

文本流是一系列字符,可以由多行構成,每行由一個換行符終止。

二進制流是一系列字節,並與外部設備上的字節一一對應)

鍵盤輸入被稱爲stdin的流表示,而到屏幕上的輸出由一個被稱爲stdout的流表示,所以可以使用與處理文件相同的技術來處理鍵盤輸入。

文件結尾:

檢測文件結尾的一種方法是在文件中放置一個特殊字符來標誌結尾,這個是曾經使用過的一種方法,現在可以使用一個內嵌的ctrl+Z字符來標誌文件的結尾。還有一種方法是根據文件的大小來斷定文件的結束位置。所以現在的文本文件可能具有也可能沒有內嵌的Ctrl+Z.,但如果該文件有,則操作系統會將該字符作爲文件尾標誌對待。

第二種方法是讓操作系統存儲文件大小的信息,如果一個文件具有3000字節,而且程序已經讀取3000字節則該程序就到達了文件尾。

對於這兩種不同方法,C的處理方法是讓getchar()函數在到達文件結尾時返回一個特殊值,而不去管操作系統是如何檢測文件結尾的,賦予該值的名稱是EOF(文件尾),因此,檢測到文件尾時getchar()的返回值是EOF。scanf()函數在檢測到文件結尾時也返回EOF。通常EOF在stdio.h文件中的定義如下:#define EOF (-1)

爲什麼是-1?一般情況下,getchar()返回一個範圍在0-127之間的值,因爲這些值與標準字符集相對應的值,但是如果系統識別則可能返回0-255的值。在每種情況中,值-1都不對應任何字符,所以可用它來表示文件結尾。

一些系統可能將EOF定義爲-1以個的值,但該定義總是與合法輸入字符所產生的返回值不同。如果包含了stdio.h文件並使用EOF符號則你不必考慮這個數值定義。重要的是EOF代表的值表示檢測到文件結尾,這個值並不是實際出現在文件中的一個符號。

如何使用EOF。將getchar()的返回值 與EOF進行比較。如果不相同,則您的程序還沒有到達文件的結尾。如:while ((ch = getchar()) != EOF);

//8-2.c

#include <stdio.h>

int main(void)

{

int ch;

while ((ch = getchar ()) != EOF)

putchar (ch);

return 0 ;

}

注意:

不必定義EOF,因爲stdio.h負責定義它

不必擔心EOF的實際值。因爲stdio.h中的#define語句使你能夠使用EOF進行符號表示

變量ch從char類型改變爲int類型。這是因爲char變量可以由範圍在0-255中的無符整數來表不而EOF可能具有數值-1.該值對無符號char變量是不可能的值。但對int則是可能的。而getchar()本身的類型實際就是int類型所以它可以讀取EOF字符

Ch是整數的事實不會對putchar有任何影響

要對鍵盤輸入使用此程序,你需要一種鍵入EOF字符的方式。不是簡單的輸入E和O和F也不是隻輸入-1(他也是兩個簡單的字符).它可能是Ctrl+Z或Ctrl+D解釋爲文件的結尾。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章