UNIX/LINUX编程实战教程——读书笔记一

UNIX/LINUX编程实战教程读书笔记 ,开篇以more指令来进入:

more可以分页显示文件的内容,大部分的Unix系统都有文本文件“ /etc/termcap”,我使用的CentOS上也有,它经常被文本编辑器和游戏程序用到,那么用“ cat /etc/termcap”来查看的时候,通常一页是显示不完,太长了,这样more的价值出来了,使用“more ****”或者“cat **** | more”。

SO,它会显示文件第一屏的内容,在屏幕的底部,more用反白字体显示文件的百分比,这时如果按空格键,文件的下一屏内容会显示出来,如果按回车键,显示的则是下一行,如果输入“q”,结束显示,如果输入“h”,显示出来的是more的联机帮助。

本书在后面用它提及的方法来展示了自己编写more功能的代码,下面会把它贴上来 ,有个地方不会一样,就是觉得17面的程序中,因为它全局已经声明了一下“int see_more();”,我就在do_more()函数里把“int see_more()”给注释了。还是要多看看代码:

/*more01.c -- version 0.1 of more
 *read and print 24 lines then pause for a few special commands
 */
#include <stdio.h>
#include <stdlib.h>
#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;
}

/*
 *read PAGELEN lines, then call see_more() for further instructions
 */
void do_more(FILE *fp)
{
	char line[LINELEN];
	int num_of_lines = 0;
//	int see_more(), reply;
	int 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++;
	}
}

/*
 *print message, wait for reponse, return # of lines to advance
 *q means no, space means yes, CR means one line
 */
int see_more()
{
	int c;
	printf("\033[7m more?\033]");
	while((c=getchar())!= EOF)
	{
		if(c == 'q')
			return 0;
		if(c == ' ')
			return PAGELEN;
		if(c == '\n')
			return 1;
	}
	return 0;
}

下面一个是在以上面为基础而更完善的一点功能的程序:

/*more02.c -- version 0.2 of more
 *read and print 24 lines then pause for a few special commands
 *feature of version of 0.2: reads from /dev/tty for commands
   */
#include <stdio.h>
#include <stdlib.h>
#define PAGELEN 24
#define LINELEN 512
void do_more(FILE *);
int see_more(FILE *);	//it is different from more01.c,
								//"Note" stands for this difference.

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;
}

/*
 *read PAGELEN lines, then call see_more() for further instructions
 */
void do_more(FILE *fp)
{
	char line[LINELEN];
	int num_of_lines = 0;
//	int see_more(), reply;
	int reply;
	FILE *fp_tty;		                 //Note
	fp_tty = fopen("/dev/tty","r");	  //Note
	if(fp_tty == NULL)					  //Note
		exit(1);								  //Note
	while(fgets(line,LINELEN,fp))
	{
		if(num_of_lines == PAGELEN)
		{
			reply = see_more(fp_tty);	  //Note
			if(reply == 0)
				break;
			num_of_lines -= reply;
		}
		if(fputs(line,stdout) == EOF)
			exit(1);
		num_of_lines++;
	}
}

/*
 *print message, wait for reponse, return # of lines to advance
 *q means no, space means yes, CR means one line
 */
int see_more(FILE *cmd)					//Note
{
	int c;
	printf("\033[7m more? \033[m");
	while((c=getc(cmd))!= EOF)			//Note
	{
		if(c == 'q')
			return 0;
		if(c == ' ')
			return PAGELEN;
		if(c == '\n')
			return 1;
	}
	return 0;
}

本书后面还留了点问题,可以更加完善后就和系统的more指令完成的功能一样了。后面会通过学习来解决它的。先到这样。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值