首頁歷史 > 正文

人人學程式設計 C語言入門 必知必會的輸入、輸出重定向問題

2022-01-25由 Soul客棧 發表于 歷史

人人學程式設計 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 #include #include int main(void){ int c ; //讀入字元 c由char改變成int型別 char prev; //前一個字元 long n_chars=0L; //字元數 int n_lines=0; //行數 int n_words=0; //單詞數 int p_lines=0; //不完整的行數 bool inword=false; //如果c在一個單詞中,則inword等於true printf(“Enter text to be analyzed(| to terminate): \n”); prev=‘\n’; //用於識別完整的行 while((c=getchar())!=EOF) { n_chars++; //統計字元 if(c==‘\n’) n_lines++; //統計行數 if(!isspace(c)&&!inword) { inword=true; //開始一個新單詞 n_words++; //統計單詞 } if(isspace(c)&&inword) inword=false; //到達單詞尾部 prev=c; //儲存字字元值 } if(prev!=‘\n’) p_lines=1; printf(“characters=%ld,words=%d,lines=%d,”,n_chars,n_words,n_lines); printf(“partial lines = %d\n”,p_lines); return 0;}

重定向是一個命令列概念

,因為您要透過在命令列鍵入特殊符號來指示它。

如果重定向不能正常工作,您可以嘗試讓程式直接開啟檔案。程式file_eof。c顯示了一個帶有簡單註釋的一個例子。

程式 file_eof。c程式

//file_eof。c ——開啟 一個檔案並顯示其內容#include #include //為了使用exit()int main (void){ int ch ; FILE * fp; char fname[50]; //用於儲存檔名 printf(“Enter the name of the file :”); scanf(“%s”,fname); fp=fopen (fname,“r”); //開啟檔案以供讀取 if (fp==Null) //嘗試開啟檔案失敗 { printf(“Failed to open file。Bye \n”); exit(1); //終止程式 } //getc (fp)從開啟的檔案中獲取一個字元 while ((ch=getc(fp)!=EOF)) putchar(ch); fclose(fp) //關閉檔案 return 0;}

下節早知道:如何處理輸入確認問題

人人學程式設計 C語言入門 必知必會的輸入、輸出重定向問題

頂部