zoukankan      html  css  js  c++  java
  • more命令编写

    打开文件的函数使用C自带的函数

    FILE* fopen(char* path,char *r); 成功返回FIEL指针

    读取文件记录的函数 fgets(buf,counts,fp); 成功返回实践读取的字数

    设置客户端的终端控制,如输入空格换屏,不要回显,当字符处理等

    使用 termios.h头函数

    struct termios info; 

    tcgetattr(0,&info) ;读取终端设置,失败返回-1

    tcsetattr(0,TCSANOW,&info); 设置终端设置,失败返回-1,TCSANOW可以设置终端立即相应

    屏蔽终端的中断信号SIGINT,使在按下ctrl - c 时退出并且能够恢复终端的设置

    信号控制使用signal.h头函数

    signal(SIGINT,fun*);SIGQUIT,SIGIO等

    此程序参考 unix/linux 编程实签教程

    #include<stdio.h>
    #include
    <termios.h>
    #include
    <signal.h>
    #define PAGELINE 24
    #define LINELEN 256
    void    do_more(FILE *);
    int     see_more(FILE *);
    void set_tty_mode();
    void reset_tty(int flag);
    void ctrl_c_hander();
    int main(int ac,char* av[])
    {
    FILE 
    *fp;
    reset_tty(
    0);
    set_tty_mode();
    signal(SIGINT,ctrl_c_hander);
    if(ac==1//equal is command self
            do_more(stdin);
    else
            
    while(--ac)
            {
                    
    if((fp=fopen(*++av,"r"))!=NULL)
                    {
                            do_more(fp);
                            fclose(fp);
                    }
                    
    else
                    {
                            reset_tty(
    1);
                            
    return -1;

                    }
            }
    reset_tty(
    1);
    return 0;
    }
    void do_more(FILE *fp)
    {
            
    char line[LINELEN];
            
    int readline=0,reply;
            FILE 
    *ttyfp;
            
    if((ttyfp=fopen("/dev/tty","r"))==NULL)
                    exit(
    1);

            
    while(fgets(line,LINELEN,fp))  //return NULL is error
            {
                    
    if(readline==PAGELINE)
                    {
                            reply
    =see_more(ttyfp);
                            
    if(reply==0)
                                    
    break;
                            
    else
                                    readline
    -=reply;
                    }
                    
    if(fputs(line,stdout)==EOF) //return EOF is error
                            exit(1);
                    readline
    ++;
            }
    }
    int see_more(FILE *ttyfp)
    {
            
    char c;
            printf(
    "\033[7m more? \033[m");
            
    while((c=getc(ttyfp))!=EOF) //return EOF is error ,from tty
            {
                    
    if(c=='q')
                            
    return 0;
                    
    if(c==' ')
                            
    return PAGELINE;
                    
    if(c=='\n')
                            
    return 1;
            }
            
    return 0;
    }
    void set_tty_mode()
    {
    struct termios setting;
    tcgetattr(
    0,&setting);
    setting.c_lflag 
    &= ~ECHO;
    setting.c_lflag 
    &= ~ICANON;
    setting.c_cc[VMIN]
    =1;
    tcsetattr(
    0,TCSANOW,&setting);
    }
    void reset_tty(int flag) //if flag=1 reset tty. flag=0 save tty mode
    {
    static struct termios info;
    static int    reset=0;
    if(flag==0)
    {
            tcgetattr(
    0,&info);
            reset
    =1;
    }
    else if(reset==1)
    {
            tcsetattr(
    0,TCSANOW,&info);

    }
    }
    void ctrl_c_hander()
    {
    reset_tty(
    1);
    exit(
    1);
    }

  • 相关阅读:
    MyOD-Linux od命令的实现
    20175320 2018-2019-2 《Java程序设计》第9周学习总结
    MyCP-实现文件的复制以及进制转换
    20175320 2018-2019-2 《Java程序设计》第8周学习总结
    2018-2019-2 20175320实验二《Java面向对象程序设计》实验报告
    20175320 2018-2019-2 《Java程序设计》第7周学习总结
    类定义20175320
    20175320 2018-2019-2 《Java程序设计》第6周学习总结
    结对编程项目-四则运算阶段性总结
    算法复习周------递归之“合并排序”
  • 原文地址:https://www.cnblogs.com/ringwang/p/1429825.html
Copyright © 2011-2022 走看看