標準輸入 標準輸出究竟是什麼?

2021-09-30 09:45:10 字數 1544 閱讀 2844

對於乙個執行的程式,不可避免地要進行某些輸入輸出操作,也即i/o操作.對於i/o操 作,c語言提供了一系列標準i/o函式,來完成輸入輸出任務.

最主要的標準i/o函式包括:fopen()(開啟乙個檔案),fprintf()(寫檔案),fscanf()(讀文 件).讀寫乙個檔案的步驟為:

開啟檔案,同時得到指向檔案的指標,然後以該指標為引數, 呼叫相應的讀,寫函式進行文 件讀寫.例如:若想從鍵盤獲取輸入(也即讀檔案,unix系統下程式可將鍵盤和螢幕當作普通檔案對待),需首先使用fopen()開啟鍵盤這個檔案,獲 得指向它的指標,然後以該指標為引數呼叫fscanf()讀取該檔案內容,從而獲得鍵盤輸入;若 想輸出資訊到顯示器(也即寫檔案),需首先開啟顯示器這個檔案,獲得指向它的指標,然後 以該指標為引數呼叫fprintf()向該檔案寫入資訊, 從而向顯示器輸出資訊.以上步驟在 unix系統中,可通過以下**實現:

view plain

/* 在unix系統下,讀取鍵盤輸入,向螢幕輸入資訊.

手動開啟鍵盤和顯示器檔案並進行讀寫.

*/#include 

intmain(

void

)    

注:/dev/tty為終端字元檔案,該檔案是對鍵盤,顯示器的抽象,向該檔案寫入,則寫入內 容將被顯示在顯示器,讀該檔案,則將從鍵盤獲得輸入.

採用以上方式獲取鍵盤輸入,向螢幕輸出將是系統相關的(因為不同系統對鍵盤,螢幕的 抽象方式不同).為了封裝鍵盤,螢幕i/o操作的底層實現細節,c語言要求系統為每個程式 提供兩個指標,這兩個指標分別指向鍵盤和螢幕,並將這兩個指標命名為:stdin和 stdout.這兩個指標就是所謂的標準輸入和標準輸出.此時,從鍵盤獲取輸入,向螢幕輸出 資訊的**可寫為:

view plain

/* 在任意系統下,讀取鍵盤輸入,向螢幕輸入資訊.

顯式得使用標準輸入,標準輸出指標.

*/#include 

intmain(

void

)    

與**1不同,該**將能夠執行於任何支援標準c的系統.由於從標準輸入獲取輸入,向標 準輸出顯示資訊是非常常用的操作(幾乎每個控制台程式均包含該操作),因此c語言提供 了專門用於從標準輸入獲取資訊和向標準輸出顯示資訊的函式,即scanf()和printf().此 時,從鍵盤獲取輸入,向螢幕顯示資訊的**可寫為:

view plain

/* 標準的c程式,讀取鍵盤輸入,向螢幕輸入資訊.

隱式得使用標準輸入,標準輸出指標.

*/#include 

intmain(

void

)    

從中可看出,使用scanf()和printf()時,無需向其提供檔案指標,這是因為它們知道所需 的檔案指標,它們操作的物件便是標準輸入和標準輸出所指向的檔案.

結論:

標準輸入,標準輸出是作業系統為c程式提供的檔案指標,預設情況下,它們分別指向鍵盤 和螢幕.標準輸入函式scanf()將從標準輸入指向的檔案讀取資訊,標準輸出函式 printf()將輸出資訊到標準輸出指向的檔案.

注:標準輸入,標準輸出並非必須指向鍵盤或螢幕,使用者程式可改變它們的指向.

標準輸入 標準輸出究竟是什麼?

本文將從基本原理解析標準輸入,標準輸出的由來 最終結論見最後 對於乙個執行的程式,不可避免地要進行某些輸入輸出操作,也即i o操作.對於i o操 作,c語言提供了一系列標準i o函式,來完成輸入輸出任務.最主要的標準i o函式包括 fopen 開啟乙個檔案 fprintf 寫檔案 fscanf 讀文...

Bundle 究竟是什麼?

bundle用於場景 在我印象中比較深刻的是,一般用於activity之間傳遞數值,也用於handler傳送訊息,如下 intent intent new intent bundle bundle new bundle bundle.putstring key value intent.putext...

分析EOF究竟是什麼

eof僅僅是一種狀態或者說條件,需要觸發。read呼叫遇到檔案結尾,觸發該條件,結果將返回0。針對eof,對於標準輸入裝置,普通檔案,管道檔案,網路套接字檔案是read如何觸發呢?下面程式將說明 server.c 是socket套接字服務端,目的為了網路套接字檔案是read如何觸發測試用的。serv...