1. 程式人生 > >重定向與檔案,具體原理篇

重定向與檔案,具體原理篇

文章目錄

重定向與檔案具體原理(對具體實現中的知識點說明)

我們先建立一個eofDemo.cpp檔案,用來讀取資料、將資料列印在螢幕上

#include <stdio.h>
int main(void)
{
	int ch;
	while((ch=getcahr(
)) != EOF) { putchar(ch); } }

1.單字元I/O:getchar()和putchar()

  • getchar() 和putchar()都是stdio.h中的函式
  • getchar() 和putchar()每次只處理一個字元
  • 我們通過while迴圈不斷讀取使用者敲入的(或者文字檔案中的)資訊,直到遇到EOF才停下來。
  • EOF在stdio.h中定義,其資料型別為int,值為-1,在ASCII碼中沒有哪個鍵對應的是-1,所以不論單獨敲入什麼鍵都無法結束輸入。
#define EOF (-1) //在stdio.h中定義
  • windows系統中可以通過阻塞式ctrl+Z來停止輸入。(這個具體解釋見下一部分2.結束鍵盤輸入)

2.結束鍵盤輸入

計算機作業系統要以某種方式判斷檔案的開始和結束,檢測檔案結尾的一種方法是,在檔案末尾放一個特殊字元標記這個檔案結尾。現在計算機作業系統可以使用內嵌的Ctrl+Z字元來標記檔案結尾。這曾是作業系統使用的唯一標記,不過現在有一些其他的選擇,例如記錄檔案的大小,所以現代的文字檔案不一定有嵌入的Ctrl + Z 但是如果有,作業系統會將其視為一個檔案結尾標記。(我們傳入的檔案有檔案結尾標記,所以計算機直到什麼時候讀取檔案結束)

3.0 重定向與檔案

輸入輸出設計函式、資料和裝置。考慮我們示例的 eofDemo.cpp 檔案,該程式使用輸入函式getchar()輸入裝置是鍵盤,輸入資料流由字元組成。假設我們希望輸入函式和資料型別不變,僅改變程式查詢資料的位置。程式怎麼去查詢輸入呢?

有兩個方法:

  • 方法1,使用特定的函式開啟關閉檔案,讀取寫入檔案。這個這裡我們暫時不談。
  • 方法2,設計能與鍵盤和螢幕互動的程式,通過不同的渠道重定向輸入至檔案和從檔案輸出。也就是把stdin流重新賦給檔案。繼續使用getchar()函式從輸入流中獲得資料。

3.1 重定向輸入

文字檔案(text file)是內含文字的檔案,其中儲存的資料是我們可以識別的字元。檔案的內容可以是一篇散文一篇詩歌一段程式碼。內含機器語言指令的檔案(如儲存可執行程式的檔案)不是文字檔案。由於該程式的操作物件是字元,所以要使用文字檔案。

<符號是UNIX和DOS/windows的重定向運算子(輸入),>符號是輸出運算子

示例的eofDemo.exe程式本身不知道(或者不關心)輸入的內容來自檔案還是鍵盤,它只知道這是需要匯入的字元流,所以它讀取這些內容,並且把字元逐個通過putchar()方法列印在螢幕上,直到讀到檔案結尾。 因為C把檔案和I/O裝置放在一個層面,所以檔案就是現在的I/O裝置。

在示例程式碼的exe所在的資料夾開啟,假設我們的exe檔案命名為eofDemo.exe,在這個資料夾中開啟cmd(命令提示符)

Microsoft Visual Studio和Vc++預設設定是吧可執行檔案放在專案資料夾的子資料夾,成為Debug。檔名和專案名的基本名相同,檔名的拓展名為exe

在這個資料夾中新建一個文字檔案aTextDemo.txt
windows中在cmd(命令提示符)中,鍵入的格式如下

D:/test/study1022/Debug/eofDemo > aTextDemo.txt	//注意,如果這裡不打txt,那麼系統會新建一個aTextDemo的無後綴檔案
the first line lalala
second line hahaha
bababalalala
^Z	//結束輸入,敲入ctrl+Z,回顯為^Z

3.2 重定向輸出

這個時候輸入的這幾行文字就傳入到了aTextDemo.txt檔案中,我們可以通過<重定向運算子在cmd中檢視該txt檔案內容

D:/test/study1022/Debug/eofDemo < aTextDemo.txt
the first line lalala
second line hahaha
bababalalala

D:/test/study1022/Debug/_