輸入和輸出涉及到函數、數據和設備。例如,考慮echo_eof.c程序。該程序使用了輸入函數getchar()、輸入設備(咱們已經假設)是鍵盤,輸入數據流由單獨的字符組成。假設您但願保持相同的輸入函數和相同的類型的數據,但但願改變程序尋找數據的位置。「程序如何瞭解在哪裏尋找其輸入?」linux
默認狀況下,使用標準I/O包的C程序將標準輸入做爲其輸入源。這就是前面標識爲stdin的流。該流是做爲向計算機中讀取數據的常規方式而創建的。一臺現代的計算機是一個靈活的工具,您可能指示它到其餘地方尋求輸入。特別地,您能夠告訴一個程序從文件而不是鍵盤尋求其輸入。shell
令程序與文件一同工做有兩種方式。一種方式是明確的使用打開文件、關閉文件、讀文件、寫文件等專門的函數。這種方法咱們在第13章中討論。第二種方式是使用一個設計用於與鍵盤和屏幕共同工做的程序,可是使用不一樣通道重定向(redirect)輸入和輸出,例如輸入到文件和從文件中輸出。換句話說,就是您將stdin流從新分配至文件。getchar()程序繼續從該流中取數據,而不真正關心流是從何處獲取其數據。這種方法比第一種方法在一此方面功能更有限,但它更容易使用,並且使您可以更加熟悉經常使用的文件處理技術。函數
重定向的一個主要問題是其與操做系統而不是C相關聯。工具
Unix、Linux和Dos重定向學習
1、輸入重定向spa
假設您已經編譯了echo_eof.c程序,並將它的可執行版本放在一個名爲echo_eof的文件中(或在Dos系統上爲echo_eof.exe)。要運行該程序,請鍵入該 可執行文件的名字:操作系統
echo_eof命令行
如今假設您但願對一個名爲words的文本文件使用該程序。文本文件是包含文本的文件,即在該 文件中的數據是以人類可讀的字符形式存儲。由於該程序處理的是字符,因此它應該與文本文件一同使用。全部您須要作的就是輸入命令時使用下列命令代替前面的命令:設計
echo_eof < wordsunix
<符號是Unix、Linux和Dos的重定向運算符。該運算符把words和stdin流關聯起來,將該文件的內容引導至echo_eof程序。echo_eof程序自己並不知道(或關心)輸入是來自文件而不是來自鍵盤 。該程序所知道的一切就是向它傳遞了一個字符流。因爲C將文件和I/O設備置於相同的地位,因此如今這個文件就是I/O設備。
2、輸出重定向
如今假設您但願echo_eof將您的鍵盤輸入發送給一個名爲mywords的文件。那麼您能夠輸入下列的命令並開始鍵入 :
echo_eof > mywords
>是另外一個重定向運算符。該 運算符會致使創建一個名爲mywords的新文件供您使用,而後將echo_eof的輸出(也就是說,您鍵入的字符的副本)重定向到該文件。該重定向將stdout從顯示設備(您的屏幕)重定向到mywords文件。您鍵入字母時在你的屏幕上出現的就是這些字母,而且它們的副本將保存到文件中。要結束程序,請在一行的開始鍵入ctrl+D(Unix中)或ctrl+Z(Dos中)。
3、組合重定向
如今假設您但願製做文件mywords的一個副本,並將其命名爲savewords。只需發出下列命令:
echo_eof < mywords >savewords
下面這個命令一樣能夠實現這一功能,由於重定向運算符的順序可有可無:
echo_eof >savewords<mywords
注意不要對同一命令的輸入和輸出使用相同的文件名。
echo < mywords > mywords --WRONG
緣由是>mywords使原始的mywords文件在用於輸入以前升序被截短爲零。
簡單的說,下面是在unix linux dos 下使用兩個重定向運算符< 和 >所遵循的規則:
一、重定向運算符將一個可執行的程序與個數據文件鏈接起來。該運算符不能用於一個數據文件與另外一個數據文件的鏈接,也不能用於一個程序與另外一個程序的鏈接。
二、使用這些運算符時,輸入不能來自一個以上的文件,輸出也不能定向至一個以上的文件。
三、除了偶爾在使用到一些對unix shell \ lunux shell 或dos具備特殊 意義的字符 時,名字和操做符之間的空格並非必需的。
4、註釋
重定向使您可以把鍵盤輸入程序用於文件。
第7章中介紹了一個統計字數的程序,該程序統計到第一個'|'字符 爲止的單詞數。將ch從char類型變爲int類型,並在循環判斷中使用EOF替代'|',這樣您就可使用該 程序統計文本文件中的單詞數了。
//word.c --統計字符、單詞和行 #include <stdio.h> #include <ctype.h> #include <stdbool.h> 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; }
重定向是一個命令行概念,由於您要經過在命令行鍵入特殊符號來指示它。
若是重定向不能正常工做,您能夠嘗試讓程序直接打開文件。程序清單8.3顯示了一個帶有簡單註釋的一個例子。詳細內容您將在第13章中學習到。
程序清單8.3 file_eof.c程序
//file_eof.c --打開 一個文件並顯示其內容 #include <stdio.h> #include <stdlib.h> //爲了使用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; }