看了APUE的IO部分後,能夠實踐一下,寫個簡陋的more命令優化
more會顯示一個屏的內容,在左下角還顯示了文件的百分比,若是按空格鍵,文件的下一屏輝縣市,若是按回車則顯示下一行內容,若是輸入'q',結束現實。code
以下:get
#include <stdio.h> #include <stdlib.h> #define PAGELEN 24 //頁面行數 #define BUFLEN 1024 // 緩衝區大小 // 根據用戶的輸入來決定顯示下一頁仍是下一行或是退出 int selectMore(FILE *fp) { int c = fgetc(fp); if (c == 'q') return 0; if (c == '\n') return 1; if (c == ' ') return PAGELEN; else return 0; } int mainMore(FILE *fp) { // 緩衝區 char buf[BUFLEN]; // 記錄已打印行數 int row = 0; // 接受用戶的選項q, ' ', '\n' int reply = 0; // 從文件流獲取一行 while (fgets(buf, BUFLEN, fp) != NULL) { // 首先判斷是否已經打印24行 if (row == PAGELEN) { // 接受打印多少行 reply = selectMore(stdin); // 不打印 退出 if (reply == 0) { exit(0); } // 打印一行 或 一頁 else { row -= reply; } } else { // 打印一行 fputs(buf, stdout); row++; } } } int main(int argc, char *argv[]) { FILE *fp = NULL; if (argc == 1) { mainMore(stdin); } // 至少提供打印的文件1個 else { while ((fp = fopen(argv[--argc], "r"))) { mainMore(fp); fclose(fp); } } exit(0); }
使用的時候,仍是有些bug,好比敲入空格時,還須要按下會車纔會顯示下一頁,還須要優化優化。it