重定向:在計算機領域,重定向是大多數命令行解釋器所具備的功能,包括各類能夠將標準流重定向用戶規定地點的Unix shells。shell
輸入重定向:可使程序可以使用文件代替鍵盤做爲輸入(則可編輯測試用例文本進行輸入)函數
輸出重定向:可使程序可以使用文件代替屏幕做爲輸出(則可將結果輸出到文件)測試
文件結尾:操做系統須要某種方式來判斷每一個文件起始和結束的位置,通常有兩種方法:一種是檢測文件結尾的的一個特殊字符來進行標識,另外一種是讓操做系統存儲文件大小的信息來進行判斷spa
對於這兩種不一樣的方法,C的處理方式是讓getchar()函數在到達文件結尾時返回一個特殊值,而無論操做系統採用哪一種方法,賦予該值得名稱是EOF(end of file),其值通常是-1,在stdio.h文件中定義。操作系統
咱們則可使用下列程序進行判斷是否讀入到文件結尾:
命令行
while((ch=getchar())!=EOF) // 當ch爲EOF時中止get
固然有時在命令行中咱們也需人爲製造結尾,也即須要結束程序時,鍵入:io
CTRL+D(Unix)或 編譯
CTRL+Z(DOS)基礎
全部字符包括回車、空格等等一切鍵盤輸入!
1、輸入重定向
在WINDOWS下存在一個須要輸入的已經編譯好的程序1.exe 以及編寫好的一個符合輸入的 2.txt 文本
則可在DOS下直接使用:(需這2個文件在同一目錄,且DOS已經切換到該目錄)
1.exe < 2.txt
程序的輸出結果則會在DOS下打印出來,這樣則能夠編寫2.txt做爲測試用例,節約操做
< 符號是Unix、Linux(和DOS)的重定向運算符,該運算符把1.txt文件與stdin流關聯起來,將該文件的內容引導至1.exe程序,程序自己並不知道也不關心輸入時來自於文件仍是鍵盤,它只知道的一切就是向它傳送了一個字符流,而後進行相應處理,直到遇到文件結尾。
2、輸出重定向
在WINDOWS下存在一個須要輸入的已經編譯好的程序4.exe ,以及想把程序輸出結果輸入到5.txt文本中
則可在DOS下直接使用:
4.exe > 5.txt
程序的輸出結果不會在DOS下打印,而會直接存入5.txt 中
>符號將輸出重定向到該文件,該重定向將stdout從顯示設備重定向到5.txt文本文件,
注:1、若5.txt在當前目錄下不存在,則會自動新建一個5.txt
2、若5.txt在當前目錄下已存在,則會刪除原文件,並創建一個新的文件進行代替!
3、若要將新內容添加在文件末尾,請使用>>操做符,也即:4.exe>>5.txt
3、組合重定向
可使用如:
1.exe < 2.txt > 3.txt
1.exe > 3.txt < 2.txt
同時替換輸入和輸出,執行1.exe,從文件2.txt讀取內容,而後將輸出寫入到3.txt中,上述2種時同樣的!
4、渠道(管道)
多個程序能夠一塊兒運行,一個程序能夠直接將另一個程序的輸出做爲其輸入,而且不須要藉助中間文件:
command1 | command2
執行command1,將其輸出做爲command2的輸入。這種方式被稱爲渠道,由於"|"字符被稱爲"渠道"。這種方式的結果和使用2個重定向及一個臨時文件的方式相等價:
command1 > tempfile
command2 < tempfile
rm tempfile
可是使用渠道的時候兩個命令是同時執行的,較爲省時。
注:1、不可對同一命令的輸入和輸出使用相同的文件名
2、輸入不能來自於一個以上的文件,輸入也不能定向至一個以上的文件
3、在運算符<、>、>> 兩側的空格都是可選的,可能有些系統規定重定向符號和文件名之間不容許有空格
也即便用重定向能夠以文本與輸入流聯繫的方式模擬咱們的鍵盤輸入,包括輸入回車,空格等等一切,可節約時間,編好一次測試用例便可
以及能夠將輸出打印到文本文件中
程序使用的都是行緩衝區,只有遇到一個換行字符纔回將緩衝區中的內容送出去,也即咱們可在輸入一個換行符前隨意刪減,直到輸入一個回車才清空緩衝區,將輸入送出至程序
另如在DOS下運行exe程序,可以使用CTRL+D(Unix)或 CTRL+Z(DOS)模擬文件結尾結束程序
#include<stdio.h>
int main(void)
{
int ch;
while((ch=getchar())!=EOF)
putchar(ch);
return 0;
}
輸入:a 回車
輸出:a 回車
輸入:b 回車
輸出:b 回車
輸入:abc 回車
輸出:abc 回車
輸入:回車
輸出:回車
輸入:^Z 回車
輸出:^Z 回車
輸入:a空格b製表符c 回車
輸出:a空格b製表符c 回車
輸入:CTRL+Z 顯示出 ^Z 再按回車程序結束
可見只有輸入回車才顯示,也即只有遇到一個換行字符纔回將緩衝區中的內容送至程序,以及getchar()函數能夠讀入回車
以輸入CTRL+Z(DOS) 人爲製造文件結尾,且程序以 ^Z 判斷爲結尾,且不可人爲直接輸入 ^Z 爲結尾
回車也是一個字符,當輸入a 回車時,對應的輸出也是 a 回車!
#include<stdio.h>
int main(void)
{
int ch;
int i;
i=1;
while((ch=getchar())!=EOF)
{
printf("執行%d次\n",i);
i=i+1;
}
return 0;
}
輸入:abc回車
輸出:執行4次
輸入:abc空格de製表符fg%回車
輸出:執行11次