more指令的實現及檔案操作函式
阿新 • • 發佈:2019-02-12
Unix中的more指令是用作分頁顯示大量資訊,並能夠進一步接收使用者的指令來進行後續顯示的命令。使用其可以直接more也可以用管道重定向。可接收的指令有q(退出),空格(新一頁)及回車(新一行)。同時還有閱讀百分比等資訊。
以下用c將其簡單實現:
在其中使用了檔案讀取函式fgetc,fputc等,此類函式通過檔案指標直接對檔案的內容進行讀寫,感覺挺有用的,簡單介紹一下。 char fgetc(FILE *fp) 是從檔案指標當前位置讀取一字元,成功則返回字元,同時指標後移一位,結束時返回EOF,值為-1。(疑惑:系統如何判定是第一次操作檔案的?初始化時直接將指標指向檔案開始位置麼?對檔案進行fgetc或fgets操作後,如果將此指標用於其他函式是否會出錯?) char fputc(char ch, FILE *fp) 將ch字元輸出到檔案當前位置,成功則返回ch,同時指標後移1位,結束返回EOF。 char *fgets(char*str, int n, FILE*fp) 從fp所指檔案當前位置讀入最多n-1個字元,最後自動加上'\0'以結束字串儲存進str陣列中,若在此過程中遇到換行或者結束符時則提前結束讀取過程。 Notice:此類檔案操作函式屬於緩衝處理函式,將ch或str寫入檔案指標fp的過程實際上只是寫入了緩衝區(需考證),待程式正常結束後寫入檔案中,若程式未正常結束,則ch或str並不會寫入到檔案中。 程式中還用到檔案的操作函式fopen,fclose等。此函式與系統呼叫函式open,close函式不同,通過檔案指標FILE *對檔案操作,而不是檔案套接字,此中區別及優劣可以另外討論,此處記錄下我之前的疑問點,主要是指標方面。 函式FILE *fopen(const char *path, const char*mode),程式中用到了fp=fopen(*++argv, "r")的表示方法。argv[]是包含命令中引數的陣列,因此argv實際上是一個二級指標,其內陣列的每格存放一個指向變數的指標。因此在使用fopen時。fp=fopen(argv[x],"r")或fp=fopen(*++argv,"r"),用argv自加的形式可減少一層迴圈巢狀。
在其中使用了檔案讀取函式fgetc,fputc等,此類函式通過檔案指標直接對檔案的內容進行讀寫,感覺挺有用的,簡單介紹一下。 char fgetc(FILE *fp) 是從檔案指標當前位置讀取一字元,成功則返回字元,同時指標後移一位,結束時返回EOF,值為-1。(疑惑:系統如何判定是第一次操作檔案的?初始化時直接將指標指向檔案開始位置麼?對檔案進行fgetc或fgets操作後,如果將此指標用於其他函式是否會出錯?) char fputc(char ch, FILE *fp) 將ch字元輸出到檔案當前位置,成功則返回ch,同時指標後移1位,結束返回EOF。 char *fgets(char*str, int n, FILE*fp) 從fp所指檔案當前位置讀入最多n-1個字元,最後自動加上'\0'以結束字串儲存進str陣列中,若在此過程中遇到換行或者結束符時則提前結束讀取過程。 Notice:此類檔案操作函式屬於緩衝處理函式,將ch或str寫入檔案指標fp的過程實際上只是寫入了緩衝區(需考證),待程式正常結束後寫入檔案中,若程式未正常結束,則ch或str並不會寫入到檔案中。 程式中還用到檔案的操作函式fopen,fclose等。此函式與系統呼叫函式open,close函式不同,通過檔案指標FILE *對檔案操作,而不是檔案套接字,此中區別及優劣可以另外討論,此處記錄下我之前的疑問點,主要是指標方面。 函式FILE *fopen(const char *path, const char*mode),程式中用到了fp=fopen(*++argv, "r")的表示方法。argv[]是包含命令中引數的陣列,因此argv實際上是一個二級指標,其內陣列的每格存放一個指向變數的指標。因此在使用fopen時。fp=fopen(argv[x],"r")或fp=fopen(*++argv,"r"),用argv自加的形式可減少一層迴圈巢狀。