Unix/Linux編程實踐教程(1)--實現more命令(C語言)

學習《Unix/Linux編程實踐教程》,第一節就講到了用C語言實現簡單的more命令。它可以接受命令行參數(如果沒有則使用標準輸入stdin)。然後顯示文件內容。


大致流程如下:

1.首先調用fopen() 函數打開文件。

2.然後是調用自己寫的函數 do_more() ,使用fgets() 與 fputs() 一行一行進行讀入和輸出。

3.首先輸出整個屏幕的文件(假設一個屏幕24行),如果文件超過24行,那麼接着調用see_more(), 根據用戶輸入,選擇輸出一行,一頁,或者退出。輸出之後接着給用戶選擇。依次循環,直到出錯或者文件讀完。

4.最後關閉文件。


///more01.c

#include
#include
#define PAGELEN 24
#define LINELEN 512

void do_more(FILE *);
int see_more();

int main(int ac, char * av[])
{
	FILE *fp;
	if (ac == 1)
		do_more(stdin);
	else
		while (--ac)
			if ((fp = fopen(* ++av,"r")) != NULL)
			{
				do_more(fp);
				fclose(fp);
			}
			else
				exit(1);

	return 0;
}

void do_more(FILE * fp)
{
	char line[LINELEN];
	int  num_of_lines = 0;
	int see_more(), reply;
	while (fgets(line, LINELEN, fp))
	{
		if (num_of_lines == PAGELEN)
		{
			reply = see_more();
			if (reply == 0)
				break;
			num_of_lines -= reply;
		}
		if (fputs(line, stdout) == EOF)
			exit(1);
		num_of_lines++;
	}
}

int see_more()
{
	int c;
	printf("\033[7m more?\033[m");
	while ((c = getchar()) != EOF)
	{
		if (c == 'q')
			return 0;
		if (c == ' ')
			return PAGELEN;
		if (c == '\n')
			return 1;
	}
	return 0;
}


此程序的思想就是調用系統函數來實現自己想要的功能。這也符合Unix的邏輯,將小的工具組合起來就是大的程序;同樣,小的工具也是調用更底層的函數接口來實現的。

程序的缺點也是很多的,比如需要用戶輸入選擇之後在按下enter才能進行,這大大影響用戶體驗啊大笑,還有提示符會隨着文件一直存在,標準輸入輸出等。都是可以改進的地方。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章