熟悉Linux的童鞋應該都知道cat命令,今天本文就帶大家來自己實現Linux下的這個命令^_^
預備知識:C語言文件處理的一些知識。
關於文件訪問,問題在於,如何設計命名文件的讀取過程呢?換句話說,如何將用戶需要使用的文件的外部名稱同讀取數據的語句關聯起來。
方法其實很簡單。在讀寫一個文件之前,必須通過庫函數fopen打開該文件。fopen用類似於x.c或x.txt這樣的外部名與操作系統進行某些必要的連接和通信(我們不必關心這些細節),並返回一個隨後可以用於文件讀寫操作的指針。
該指針稱為文件指針,它指向一個包含文件信息的結構(體),這些信息包括:緩沖區的位置、緩沖區中當前字符的位置、文件的讀或寫狀態、是否出錯或是否已經到達文件結尾等等。用戶不必關心這些細節,因為在<stdio.h>中已經定義了一個包含這些信息的結構FILE。在程序中只需要按照下列方式聲明一個文件指針即可:
FILE *fp;
FILE *fopen(char *name, char *mode);
在本例中,fp是一個指向結構FILE的指針,並且fopen函數返回一個指向結構FILE的指針。
在程序中,可以這樣調用fopen函數:
fp = fopen(name, mode);
第一個參數是文件名,第二個參數是訪問模式。允許的訪問模式有:讀("r")、寫("w")及追加("a")。
關於文件大致就簡單這樣介紹下,更多詳細內容請參考相關書籍^_^。
下面的程序主要實現cat命令的查看文件內容的功能:
#include <stdio.h>
void filecopy(FILE *, FILE *);
int main(int argc, char * argv[])
{
FILE *ifp;
FILE *ofp;
if(argc == 1)
filecopy(stdin, stdout);
/*else if(argc == 3)
{
if(((ifp = fopen(argv[1], "r")) != NULL) && ((ofp = fopen(argv[2], "a")) != NULL))
{
filecopy(ifp, ofp);
fclose(ifp);
fclose(ofp);
} else
{
printf("ERROR: can't open file");
exit(1);
}
} */else
{
while(--argc > 0)
if((ifp = fopen(*++argv, "r")) == NULL)
{
printf("cat: can,t open %s\n", *argv);
exit(1);
} else
{
filecopy(ifp, stdout);
fclose(ifp);
}
}
return 0;
}
void filecopy(FILE * ifp, FILE * ofp)
{
int c;
while((c = getc(ifp)) != EOF)
putc(c, ofp);
}
程序運行結果示例:
另外如果命令輸入是“cat 文件名1 文件名2”時,希望程序的功能是將文件1中內容追加到文件2中的話,將上面程序注釋部分取消就可以實現該功能,其他查看功能不變。
更多cat命令信息參看:Linux下cat命令詳解 http://www.linuxidc.com/Linux/2011-12/48774.htm
經我測試,上面的程序能實現
cat命令的三大功能:
1.一次顯示整個文件。$ cat filename
2.從鍵盤創建一個文件。$ cat > filename (將標准輸入的內容寫到filename中)
3.將幾個文件合並為一個文件: $cat file1 file2 > file
測試圖片:
13個Cat命令管理(顯示,排序,建立)文件實例 http://www.linuxidc.com/Linux/2013-12/93540.htm
11個很少有人知道但很有用的Linux命令 http://www.linuxidc.com/Linux/2013-10/92095.htm
Linux下常用文本處理命令 http://www.linuxidc.com/Linux/2013-10/91825.htm
Linux常用網絡命令整理 http://www.linuxidc.com/Linux/2013-09/90503.htm
Linux 命令整理 http://www.linuxidc.com/Linux/2013-09/89936.htm
Linux 新手必學的 20 個命令 http://www.linuxidc.com/Linux/2013-08/88477.htm