許多作業系統,包括MS-DOS和UNIX,可以對輸入輸出進行重新導向。為了理解這個機制,首先考慮下面這個UNIX命令:
ls
這個命令在螢幕上顯示檔案的目錄列表(MS-DOS中的對應命令是DIR)。現在考了下面這個命令:
ls>tmp
符號>導致作業系統把這個命令的輸出重新導向到tmp檔案。原來在螢幕上輸出的內容現在寫入到tmp檔案中。
我們來看下面這個程式。它在使用時可以對輸入輸出進行重新導向。這個程式從標準輸入檔案(通常情況下串連到鍵盤)讀取字元,並把每個字元兩次寫入到標準輸出檔案(通常情況下串連到螢幕)。
db1_out.c
#include<stdio.h>
int main(void)
{
char c;
while(scanf("%c,&c)==1){
printf("%c",c);
printf("%c",c);
}
return 0;
}
如果我們編譯器,並把可執行代碼放在db_out1中,然後使用重新導向,我們可以按照4種方式調用這個程式:
dbl_out
dbl_out<infile
dbl_out>outfile
dbl_out<infile>outfile
以下是關於C語言輸入輸出重新導向的詳細講解:
1. C語言是沒有I/O的語言
C語言本身就是沒有I/O能力的語言,是依靠函數模組來完成的。如printf()就是一個I/O函數,在編譯時間,編譯器並不編譯printf()函數,而把他留在連結(link)階段由連結器來處理。這樣做的優點是:
提高了C編譯器的可移植性。因為I/O與電腦的硬體關係密切,如果C語言本身具備I/O能力,那麼在不同的電腦上,編譯器就會因為I/O的差異而必須重新設計。如果把I/O功能從編譯器中分離出來成為獨立的函數,那麼編譯器就不必因為硬體的變化而修改,只需修改函數模組即可。並且I/O函數模組是單獨存在的,因而修改工作大為簡化。
2. I/O轉向的概念
在設計程式時,必須指定資料的輸入來源(如鍵盤),以及資料處理完畢後的輸出目的地(如檔案,印表機),所以必須在程式中指定輸入/輸入裝置後才能運行。可是指定了某個輸入/輸入裝置後,如果再想換由其他裝置輸入/輸出,則必須要修改來源程式,重新進行編譯、連結。為了避免這個缺點,C語言提供的I/O的重新導向能力。
C語言將鍵盤與螢幕叫做標準I/O(Standard Input/Output, STDIO),凡是以標準I/O作為輸入/輸出的程式,均可重新導向改由其他檔案或裝置做輸入/輸出。所以我們在編寫程式時,可先用標準I/O作為輸入/輸出對象,等到真正運行時,再重新導向到真正需要輸入/輸出的檔案。這樣就可避免在編寫程式時設定輸入/輸出的檔案名稱,當需要更改時又返回到程式進行修改的煩惱了。
大多數作業系統如Linux,Unix及MS DOS都具有I/O重新導向的能力,在這些系統上運行程式(不僅限於C程式),都可以使用I/O重新導向。許多作業系統把裝置視為一個檔案,所以I/O可以重新導向到檔案,也可以轉向到一些介面裝置。
附:Linux中是用>、>>及<做重新導向的工作。其格式如下:
程式>檔案A:將程式的輸出重新導向送往檔案A,檔案A先前的內容將被清楚。
程式>>檔案A:將程式的輸出重新導向送往檔案A,並附加至檔案A的末尾,檔案A先前的內容不會被清楚。
程式<檔案B:將檔案B的內容送往程式處理。
1. C語言是沒有I/O的語言 C語言本身就是沒有I/O能力的語言,是依靠函數模組來完成的。如printf()就是一個I/O函數,在編譯時間,編譯器並不編譯printf()函數,而把他留在連結(link)階段由連結器來處理。這樣做的優點是: 提高了C編譯器的可移植性。因為I/O與電腦的硬體關係密切,如果C語言本身具備I/O能力,那麼在不同的電腦上,編譯器就會因為I/O的差異而必須重新設計。如果把I/O功能從編譯器中分離出來成為獨立的函數,那麼編譯器就不必因為硬體的變化而修改,只需修改函數模組即可。並且I/O函數模組是單獨存在的,因而修改工作大為簡化。 2. I/O轉向的概念 在設計程式時,必須指定資料的輸入來源(如鍵盤),以及資料處理完畢後的輸出目的地(如檔案,印表機),所以必須在程式中指定輸入/輸入裝置後才能運行。可是指定了某個輸入/輸入裝置後,如果再想換由其他裝置輸入/輸出,則必須要修改來源程式,重新進行編譯、連結。為了避免這個缺點,C語言提供的I/O的重新導向能力。 C語言將鍵盤與螢幕叫做標準I/O(Standard Input/Output, STDIO),凡是以標準I/O作為輸入/輸出的程式,均可重新導向改由其他檔案或裝置做輸入/輸出。所以我們在編寫程式時,可先用標準I/O作為輸入/輸出對象,等到真正運行時,再重新導向到真正需要輸入/輸出的檔案。這樣就可避免在編寫程式時設定輸入/輸出的檔案名稱,當需要更改時又返回到程式進行修改的煩惱了。 大多數作業系統如Linux,Unix及MS DOS都具有I/O重新導向的能力,在這些系統上運行程式(不僅限於C程式),都可以使用I/O重新導向。許多作業系統把裝置視為一個檔案,所以I/O可以重新導向到檔案,也可以轉向到一些介面裝置。附:Linux中是用>、>>及<做重新導向的工作。其格式如下:程式>檔案A:將程式的輸出重新導向送往檔案A,檔案A先前的內容將被清楚。程式>>檔案A:將程式的輸出重新導向送往檔案A,並附加至檔案A的末尾,檔案A先前的內容不會被清楚。程式<檔案B:將檔案B的內容送往程式處理。