標準輸入與Ctrl D Ctrl Z

2021-08-08 22:55:23 字數 970 閱讀 4686

標準輸入裝置是行緩衝的,當從鍵盤上輸入字串,輸入的字串會首先被送到輸入緩衝區中儲存,當銨下回車鍵後才會去檢測輸入緩衝區中是否有了資料(也就是說fgets、fgetchar等函式這個時候才去從緩衝區中讀資料)。我們可以把輸入緩衝區理解為檔案,那麼對於這個檔案來說,它也有結束的時候,輸入函式在從緩衝區中讀檔案的時候也會去檢測有沒有流結束標誌(eof),這種標誌是通過ctrl+d 或 ctrl+z產生的。ctrl+d和ctrl+z的檢測主要分為兩種:阻塞式 和 非阻塞式。

阻塞式: 指只有在按下回車鍵後才對之前是否有按下ctrl+z進行檢測。

非阻塞式: 指在按下ctrl+d之後立即響應。

在非阻塞式模式下,按下ctrl+d後立即響應,如果在此之前有輸入字元,則ctrl+d就相當於回車,即把輸入的內容送到輸入緩衝區供讀取使用,此時ctrl+d不作為流結束符使用,下次按下的ctrl+d則作為流結束標誌。如果按下ctrl+d之前沒有輸入任何資料,剛ctrl+d作為流結束標誌,表示標準輸入裝置對應的檔案結束。linux下輸入就是非阻塞式的。

在windows系統中輸入一般採用阻塞式模式來對ctrl+z進行檢測,在這種模式下,只有按下回車對會去檢測之前有沒有按下ctrl+z,才會去檢測流是否結束。那麼就會有這樣乙個問題,就是在按下回車之前,輸入緩衝區並不能檢測到是否有ctrl+z按下,所以即使按了ctrl+z,照樣還可以從鍵盤去輸入內空,但是ctrl+z這賓輸入的內容到時候並不會被讀取到,因為在緩衝區檢測時,如果檢測到ctrl+z(結束標誌),就會認為輸入流結束了,那麼後邊的內容就不會被讀進行,而被丟掉。

另外還有一點需要說明,就是ctrl+z或ctrl+d並不會產生乙個普通的ascii碼值,也就是說它不會產生乙個字元,不會被放到輸入緩衝區中,所以大家也是讀不到它的,那麼可能有人會懷疑那我們時寫的類似於這樣的判斷是怎麼回事:

while(ch != eof ) …

其實eof就是乙個複數(多數情況下就是-1),如果檢測到輸入流結束標誌,則會讓從鍵盤讀取的函式返回值-1,這樣就可以實現當檔案結束時退出迴圈的。

標準輸入與標準輸出

輸入cat 命令時,他會從stdin 對通斷介面來說,標準輸入就是鍵盤 接受輸入,cat testfile 現在cat命令會用testfile檔案中的行為作為輸入,可以使用這種技術將資料輸入到任何能從stdin接受資料的shell命令 stdout 在終端介面上,標準輸出就是終端顯示器。ls l t...

C 的標準輸入與標準輸出

標準輸入輸出是相對於程式而言的,輸入指的是從io裝置輸入到程式中,輸出指的是從程式中向io裝置輸出。使用型別為istream的cin物件處理輸入,使用型別為ostream的cout物件處理輸出。另外兩個ostream型別的輸出物件為cerr和clog。向流寫入資料 std cout hello wo...

標準輸出printf與標準輸入scanf

一 標準輸出printf 標頭檔案 stdio.h 原型 int printf const char format,引數 format 格式控制字串 可變引數列表 返回值 輸出字元的數量。注意點 對於標準輸出printf,我們需要注意的是返回值,很多人會忽略返回值的型別和代表的含義。二 標準輸入sc...