重定向和文件
一、相關基礎知識
重定向:在計算機領域,重定向是大多數命令行解釋器所具有的功能,包括各種可以將標准流重定向用戶規定地點的Unix shells。
輸入重定向:可以使程序能夠使用文件代替鍵盤作為輸入(則可編輯測試用例文本進行輸入)
輸出重定向:可以使程序能夠使用文件代替屏幕作為輸出(則可將結果輸出到文件)
文件結尾:操作系統需要某種方式來判斷每個文件起始和結束的位置,一般有兩種方法:一種是檢測文件結尾的的一個特殊字符來進行標識,另一種是讓操作系統存儲文件大小的信息來進行判斷
對於這兩種不同的方法,C的處理方式是讓getchar()函數在到達文件結尾時返回一個特殊值,而不管操作系統采用哪種方法,賦予該值得名稱是EOF(end of file),其值一般是-1,在stdio.h文件中定義。
我們則可以使用下列程序進行判斷是否讀入到文件結尾:
while((ch=getchar())!=EOF) // 當ch為EOF時停止
當然有時在命令行中我們也需人為制造結尾,也即需要結束程序時,鍵入:
CTRL+D(Unix)或
CTRL+Z(DOS)
二、具體內容
所有字符包括回車、空格等等一切鍵盤輸入!
重定向標准輸入輸出:
一、輸入重定向
在WINDOWS下存在一個需要輸入的已經編譯好的程序1.exe 以及編寫好的一個符合輸入的 2.txt 文本
則可在DOS下直接使用:(需這2個文件在同一目錄,且DOS已經切換到該目錄)
1.exe < 2.txt
程序的輸出結果則會在DOS下打印出來,這樣則可以編寫2.txt作為測試用例,節約操作
< 符號是Unix、Linux(和DOS)的重定向運算符,該運算符把1.txt文件與stdin流關聯起來,將該文件的內容引導至1.exe程序,程序本身並不知道也不關心輸入時來自於文件還是鍵盤,它只知道的一切就是向它傳送了一個字符流,然后進行相應處理,直到遇到文件結尾。
二、輸出重定向
在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
三、組合重定向
可以使用如:
1.exe < 2.txt > 3.txt
1.exe > 3.txt < 2.txt
同時替換輸入和輸出,執行1.exe,從文件2.txt讀取內容,然后將輸出寫入到3.txt中,上述2種時一樣的!
四、渠道(管道)
多個程序可以一起運行,一個程序可以直接將另外一個程序的輸出作為其輸入,並且不需要借助中間文件:
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次