歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

如何編寫Linux下的cat命令?

熟悉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

Copyright © Linux教程網 All Rights Reserved