more命令的簡單實現

看了APUE的IO部分後,能夠實踐一下,寫個簡陋的more命令優化

more能作什麼

more會顯示一個屏的內容,在左下角還顯示了文件的百分比,若是按空格鍵,文件的下一屏輝縣市,若是按回車則顯示下一行內容,若是輸入'q',結束現實。code

more的基本用法

  • more filename
  • command | more
  • more < filename

簡單的實現方法

以下: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

相關文章
相關標籤/搜索