人人學程式設計 C語言入門 必知必會的輸入、輸出重定向問題
相關閱讀:資料流、檔案和鍵盤終止
輸入和輸出涉及到函式、資料和裝置。例如,考慮上篇文章中的echo_eof。c程式。該程式使用了輸入函式getchar()、輸入裝置(我們已經假設)是鍵盤,輸入資料流由單獨的字元組成。
假設您希望保持相同的輸入函式和相同的型別的資料,但希望改變程式尋找資料的位置。“程式如何瞭解在哪裡尋找其輸入?”
預設情況下,使用標準I/O包的C程式將標準輸入作為其輸入源
。這就是前面標識為stdin的流。該流是作為向計算機中讀取資料的常規方式而建立的。一臺現代的計算機是一個靈活的工具,您可能指示它到其他地方尋求輸入。特別地,您可以告訴一個程式從檔案而不是鍵盤尋求其輸入。
令程式與檔案一同工作有兩種方式。
一種方式是明確的使用開啟檔案、關閉檔案、讀檔案、寫檔案等專門的函式。
這種方法我們在後面討論。
第二種方式是使用一個設計用於與鍵盤和螢幕共同工作的程式,但是使用不同通道重定向(redirect)輸入和輸出,例如輸入到檔案和從檔案中輸出。
換句話說,就是您將stdin流重新分配至檔案。getchar()程式繼續從該流中取資料,而不真正關心流是從何處獲取其資料。這種方法比第一種方法在一此方面功能更有限,但它更容易使用,而且使您能夠更加熟悉常用的檔案處理技術。
重定向的一個主要問題是其與作業系統而不是C相關聯。
一、輸入重定向
假設您已經編譯了echo_eof。c程式,並將它的可執行版本放在一個名為echo_eof的檔案中(或在Dos系統上為echo_eof。exe)。要執行該程式,請鍵入該 可執行檔案的名字:
echo_eof
現在假設您希望對一個名為words的文字檔案使用該程式。文字檔案是包含文字的檔案,即在該 檔案中的資料是以人類可讀的字元形式儲存。因為該程式處理的是字元,所以它應該與文字檔案一同使用。所有您需要做的就是輸入命令時使用下列命令代替前面的命令:
echo_eof < words
“<”符號是Unix、Linux和Dos的重定向運算子。
該運算子把words和stdin流關聯起來,將該檔案的內容引導至echo_eof程式。echo_eof程式本身並不知道(或關心)輸入是來自檔案而不是來自鍵盤 。
該程式所知道的一切就是向它傳遞了一個字元流。由於C將檔案和I/O裝置置於相同的地位,所以現在這個檔案就是I/O裝置。
二、輸出重定向
現在假設您希望echo_eof將您的鍵盤輸入傳送給一個名為mywords的檔案。那麼您可以輸入下列的命令並開始鍵入 :
echo_eof > mywords
>是另一個重定向運算子。
該 運算子會導致建立一個名為mywords的新檔案供您使用,然後將echo_eof的輸出(也就是說,您鍵入的字元的副本)重定向到該檔案。該重定向將stdout從顯示裝置(您的螢幕)重定向到mywords檔案。您鍵入字母時在你的螢幕上出現的就是這些字母,並且它們的副本將儲存到檔案中。要結束程式,請在一行的開始鍵入ctrl+D(Unix中)或ctrl+Z(Dos中)。
三、組合重定向
現在假設您希望製作檔案mywords的一個副本,並將其命名為savewords。只需發出下列命令:
echo_eof < mywords >savewords
下面這個命令同樣可以實現這一功能,因為重定向運算子的順序無關緊要:
echo_eof >savewords 注意不要對同一命令的輸入和輸出使用相同的檔名。 echo < mywords > mywords ——WRONG 原因是>mywords使原始的mywords檔案在用於輸入之前升序被截短為零。 簡單的說,下面是在unix linux dos 下使用兩個重定向運算子< 和 >所遵循的規則: 1、 重定向運算子將一個可執行的程式與一個數據檔案連線起來。 該運算子不能用於一個數據檔案與另一個數據檔案的連線,也不能用於一個程式與另一個程式的連線。 2、使用這些運算子時, 輸入不能來自一個以上的檔案,輸出也不能定向至一個以上的檔案 。 3、除了偶爾在使用到一些對unix shell \ linux shell 或dos具有特殊 意義的字元 時, 名字和運算子之間的空格並不是必需的 。 四、註釋 重定向使您能夠把鍵盤輸入程式用於檔案。 第7章中介紹了一個統計字數的程式,該程式統計到第一個‘|’字元 為止的單詞數。將ch從char型別變為int型別,並在迴圈判斷中使用EOF替代‘|’,這樣您就可以使用該 程式統計文字檔案中的單詞數了。 //word。c ——統計字元、單詞和行#include 重定向是一個命令列概念 ,因為您要透過在命令列鍵入特殊符號來指示它。 如果重定向不能正常工作,您可以嘗試讓程式直接開啟檔案。程式file_eof。c顯示了一個帶有簡單註釋的一個例子。 程式 file_eof。c程式 //file_eof。c ——開啟 一個檔案並顯示其內容#include 下節早知道:如何處理輸入確認問題