1. 程式人生 > >標準輸入、標準輸出究竟是什麼? .

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

本文將從基本原理解析標準輸入,標準輸出的由來(最終結論見最後).

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

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

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

[cpp] view plaincopyprint?
  1. /*  
  2.     在Unix系統下,讀取鍵盤輸入,向螢幕輸入資訊. 
  3.     手動開啟鍵盤和顯示器檔案並進行讀寫. 
  4.  */
  5. #include <stdio.h> 
  6. int main(void)  
  7. {  
  8. FILE *pf;  
  9.     pf=fopen("/dev/tty","a+");       //終端字元檔案
  10. char sbuf[100];  
  11.     fprintf(pf, "Please input a string: ");  
  12.     fscanf(pf,"%s",sbuf);  
  13.     fprintf(pf,"The input string is : \"%s\".\n"
    ,sbuf);  
  14. return 0;  
  15. }  

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

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

[cpp] view plaincopyprint?
  1. /*  
  2.    在任意系統下,讀取鍵盤輸入,向螢幕輸入資訊. 
  3.    顯式得使用標準輸入,標準輸出指標. 
  4.  */
  5. #include <stdio.h> 
  6. int main(void)  
  7. {   
  8. char sbuf[100];   
  9.     fprintf(stdout, "Please input a string: ");   
  10.     fscanf(stdin,"%s",sbuf);   
  11.     fprintf(stdout,"The input string is : \"%s\".\n",sbuf);   
  12. return 0;  
  13. }  

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

[cpp] view plaincopyprint?
  1. /*  
  2.    標準的C程式,讀取鍵盤輸入,向螢幕輸入資訊. 
  3.    隱式得使用標準輸入,標準輸出指標. 
  4.  */
  5. #include <stdio.h> 
  6. int main(void)  
  7. {   
  8. char sbuf[100];   
  9.     printf("Please input a string: ");   
  10.     scanf("%s",sbuf);   
  11.     printf("The input string is : \"%s\".\n",sbuf);   
  12. return 0;  
  13. }  
從中可看出,使用scanf()和printf()時,無需向其提供檔案指標,這是因為它們知道所需 的檔案指標,它們操作的物件便是標準輸入和標準輸出所指向的檔案.

結論:

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

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