C語言輸入輸出的重新導向

來源:互聯網
上載者:User

 

許多作業系統,包括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的內容送往程式處理。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.