1. 程式人生 > >C Primer Plus (第五版)中文版——第 8 章 字元輸入/輸出和輸入確認

C Primer Plus (第五版)中文版——第 8 章 字元輸入/輸出和輸入確認

8.1  單字元 I/O:getchar() 和 putchar()

getchar() 和 putchar() 每次輸入和輸出一個字元。一個輸入回顯例子:

/*使用一個while迴圈,該迴圈在遇到#時終止*/
int main(void)
{
	char ch;

	while ((ch = getchar()) != '#')
	{
		putchar(ch);
	}
	return 0;
}

8.2  緩衝區

  • 輸入字元的立即回顯是非緩衝(unbuffered)或直接輸入(direct)的一個例項,它表示您所鍵入的字元對正在等待的程式立即可用。
  • 輸入字元的延遲迴顯是緩衝輸入(buffered)的一個例項,這種情況下您所鍵入的字元被收集並存儲在一個被稱為緩衝區(buffer)的臨時儲存區域中,按下回車鍵可使您所鍵入的字元塊變為可用。

為什麼需要緩衝區?

  • 將若干個字元作為一個塊傳輸比逐個傳送這些字元耗費的時間少。
  • 如果輸入有誤,就可以使用您的鍵盤更正功能來修正錯誤,當最終按下回車鍵時,就可以傳送正確的輸入。

為什麼需要非緩衝區?

  • 一些互動性的程式需要非緩衝輸入。例如:您希望一按下鍵就執行某個命令。

緩衝區的分類:

  • 完全緩衝(fully buffered)I/O :緩衝區滿時被清空(內容被髮至其目的地)
  • 行緩衝(line-buffered)I/O:遇到一個換行字元時緩衝區被清空。鍵盤輸入是標準的行緩衝。

8.3  終止鍵盤輸入

8.3.1  檔案、流和鍵盤輸入

  • 檔案(file)是一塊儲存資訊的儲存器區域。流(stream)是一個理想化的資料流,實際輸入或輸出對映到這個資料流。
  • 開啟檔案的過程就成為將流與檔案相關聯,並通過流進行讀寫的過程。
  • 鍵盤輸入有一個被稱為 stdin 的流表示。
  • 螢幕上的輸出由一個被稱為 stdout 的流表示。

結論:可以使用與處理檔案相同的技術來處理鍵盤輸入。

8.3.2  檔案結尾

計算機作業系統需要某種方式來斷定每個檔案其實和結束的位置。檢測檔案結尾的方法有:

  • 在檔案中放置一個特殊字元來標誌結尾。
  • 讓作業系統儲存檔案大小的資訊。

在 C 中,檢測到檔案尾時,getchar() 和scanf() 的返回值是EOF。EOF 代表的值表示檢測到檔案結尾。使用方法:

while((ch = getchar()) != EOF)    /*將getchar()的返回值與EOF進行比較*/

因此可以重寫輸入回顯程式:

int main(void)
{
	char ch;

	while ((ch = getchar()) != EOF)
	{
		putchar(ch);
	}
	return 0;
}

8.4  重定向和檔案

  • 輸入重定向使您的程式能夠使用檔案代替鍵盤作為輸入
  • 輸出重定向使您的程式能夠使用檔案代替螢幕作為輸出

一、輸入重定向

echo_eof < words

< 符號是重定向運算子,該運算子把 words 檔案與 stdin 流關聯起來。將該檔案的內容引導至 echo_eof 程式。

二、輸出重定向

echo_eof > mywords

> 符號是重定向運算子,該運算子建立一個名為 mywords 的新檔案供您使用,將 stdout 從顯示裝置重定向到該檔案。

三、組合重定向

  • 重定向運算子將一個可執行(executable)程式與一個數據檔案連線起來。
  • 使用重定向運算子時,輸入不能來自一個以上的檔案,輸出也不能定向至一個以上的檔案。
  • 名字和操作符之間的空格不是必須的。

8.5  建立一個更友好的使用者介面

8.5.1  使用緩衝輸入

緩衝輸入提供給使用者在將輸入傳送至程式前對其進行編輯的機會,但在使用字元輸入時會給程式設計人員帶來麻煩。

8.5.2  混合輸入數字和字元

假設程式同時需要使用 getchar() 進行字元輸入和使用 scanf() 進行數字輸入。由於 getchar() 讀取每個字元,包括空格、換行符和製表符;而scanf() 在讀取數字時則會跳過空格、換行符和製表符。當呼叫 getchar() 之前 scanf() 恰好在輸入中留下一個換行符或其他字元時,可能將產生問題。因此二者混合使用時需要注意。

8.6  輸入確認

在實際情況中,程式的使用者並不總是遵循指令。當用戶完成輸入後,您應該確認使用者的輸入是否符合指令,若不符合,可以提示使用者重新進行輸入,若輸入符合指令,再使程式繼續執行。

8.7  選單瀏覽

選單使程式對使用者而言更加友好,也給程式設計人員提出了一些問題。程式設計人員希望程式達成兩個目標:

  • 程式在使用者遵循指令時順利進行
  • 程式在使用者沒有遵循指令時也能順利進行

通常第二個目標較難實現,因為預見程式所有可能的使用者錯誤行為是非常困難的。當您編寫程式時,要仔細地計劃使用者介面。嘗試預見使用者可能犯的錯誤型別,然後設計您的程式對其進行處理。

8.11  程式設計練習

程式設計練習參考程式