mvhline函数

    xiaoxiao2021-04-15  100

    一:IO基础

    1.认识内核对象

      不允许访问内核设备和内存

      但是可以通过内核系统函数去访问

       对每个内核对象进行编号ID

      如果要访问内核对象,只能通过ID

     编程模型:

       申请得到一个ID

       在内核系统函数中使用ID得到对应内核对象

    2.怎么访问文件

      使用函数,传递一个文件,系统打开文件,加载文件数据,返回一个ID

      使用函数,传递ID ,得到数据

      使用函数传递ID,释放文件

     

      ID:就是文件描述符

    每个程序执行的时候都会有一个文件来存放文件描述符。

    3.每个程序可以默认打开三个文件设备:

     0:标准输入

     1:标准输出

     2:错误输出

    但是0,1,2都可以读写,但是建议遵循以上规则

    4.操作文件描述符:

      ssize_t write(int fd, void *buf,size_t size)

      返回值:大于零,实际写入的数据 ,-1,写入错误

      ssize_t read(int fd,void *buf,size_t size)

      返回值:>0实际读取的数据   =0碰到文件结束符EOF (ctrl+d) -1:读取错误

    二:基于文件的描述符

     1.得到文件描述符/释放文件描述符

       a.文件类型

         目录文件d

         普通文件f

         字符设备文件c

         块设备文件b

         软链接文件l

         管道文件p

         socket文件s

         

       b.文件属性

         1.属性的表达方式:绝对模式,字符模式

         2.文件的权限属性:读 写 执行 粘附位 用户设置位权限 组设置位权限

          五位分别为:

                特殊权限    拥有者owner  组group  其他用户

     2.通过文件描述符号读写各种数据

     3.文件描述符号与重定向

     

    三:IO与文件映射

       1.IO的共享与效率

         read和write其中的数据缓冲的大小

    读取数据的缓冲:getpagesize最佳

       2.定位于定位读取

        read与write在操作的时候,自动移动位置

         lseek改变读取定位:

         off_t  lseek(

         int fd;//定位文件描述符

         off_t off; //定位位置,即偏移量

         int whence//参照点:文件开始位置/文件结束位置,文件当前位置

                        //  SEEK_SET                           SEEK_CUR

         )

    只要lseek定位合法,定位超出文件大写都是可以的

     

         pread/pwrite 在指定位置读写

         lseek+read=pread

         lseek+write=pwrite

    如:pread(fd,&score,sizeof(float),5);//文件标示符,buf,大小,偏移量

    pread会改变当前的位置

      3.文件的其他操作

    fstat 获取文件的状态(大小,权限):

    struct  stat;

    int fstat(fd,&stat)

    int lstat()

    成功返回0,失败返回-1

    案例:/home/study/linux/stat.c

     

    ftruncate改变文件的大小

     4.文件映射

      虚拟地址映射到内存

      虚拟地址可以映射到文件:可以用内存方式访问文件,读写文件

      mmap  /munmap

    案例:

      1使用内存方式写入数据

      2使用内存方式读取数据

       代码:/home/study/linux/map_write.c

    四:文件描述符的操作(IO锁)

      1.dup  dup2 拷贝文件描述符

       dup()拷贝文件描述符,返回系统指定的整数

       dup2()拷贝文件描述符,返回用户指定的整数

     

     2.fcntl对文件描述的属性的修改

       fcntl(int  fd,//文件描述符

              int cmd//文件描述符的操作

              )

       2.1拷贝文件描述符

       2.2修改判定文件的描述标记

       2.3 修改文件的状态标记

       2.4设置强制锁(需要重新编译内核)

       2.5设置建议锁(内核中的默认方式)

       2.6设置信号

    五、IO 与Curses

    Curses:CUI

    curses是一个在Linux/Unix下广泛应用的图形函数库,curses的名字起源于"cursor optimization",即光标优化

    UI:user interface

    CUI:字符界面接口

    GUI:图形界面接口

    使用一套封装库 libcurses.so

    在/usr/lib目录下

    如果头文件curses.h不存在,尝试ncurses.h(即newCurses)

     

    printf和scanf是标准到IO,

    大部分标准IO重定向到终端

    Curses就是终端输出

     

    为了防止printf重定向到终端破坏UI,建议禁止在Curses中使用标准IO

    1.编程模型

          初始化终端initscr

          操作终端(输入、输出、定位、刷新)

    2.显示

          2.1图形输出:

          border();8个参数:左,右,上,下,左上,右上,左下,右下,可以用0默认值,左右为竖线,上线为横线,四角为制表符

          box();

          box需要一个窗体指针,而initscr返回一个初始化的窗体:标准屏幕window*,实际上Curses定义一个全局变量stdscr,它其实就是标准屏幕,所以可以定义一个窗体或者使用标准屏幕。

       划线:指定位置化线前面加mv,指定窗口划线加w,指定窗口的指定位置化,加mvw,

          hline():标准屏幕stdscr上的0行0列开始化水平线

          whlile

          vline:0行0列开始化垂直线

          wvline:指定窗口划线

          mvhline(y,x,ch,n):指定位置开始化,如mvhline(2,10,’-’,20);

          mvwhline:

          mvvline

          mvwnline

          属性字符:字节=属性字节+

         2.2刷屏

           void refresh();标准屏幕

           void wrefresh(WINDOW*);指定的屏幕

           从里到外刷屏,

    2.3字符输出

       addch

       waddch

       mvaddch

       mvwaddch

       (以上函数命名和画线规则一样)

       echochar:回旋字符

       wechochar:某窗体的回旋字符  属性字符:’’|A_属性,比如A_BOLD粗体,A_UNDERLINE下划线

      特殊属性字符:比如ACS_PI

    2.4 字符串输出

       规则:n表示字符串个数,w表示窗口,mv是任意位置

      int  addstr(const char *str);

       addnstr(const char *str,int n);

       waddstr(WINDOW *win,cosnt char *str);

       waddnstr();

       mvaddstr(x,y,ch);在(x,y)上显示一串字串 相当于呼叫move(y,x);addstr(str)

       mvwaddnstr(WINDOW *win,int y,int x,const  char *str,int n);

    2.5 格式化字符串输出

    int printw(const char *str,.......);  mvprintw(4,10,”行:%d,列:%d”,LINES,COLS)

       wprintw

       mvprintw

       mvwprintw

       

    3.字符性质和颜色

          颜色属性:

          3.1判定终端是否支持颜色

           bool has_colors();

           

          3.2初始化颜色:

           start_color();

         3.3定义颜色对

           int init_pair(short pair,short fore,short  back);有前景色和后景色

    3.4 使用颜色对

       COLOR_PAIR(short pair);

           这组函数一定要在initscr后调用

     3.5设置背景颜色

        bcgd(COLOR_PAIR(short pair));

    3.6设置属性

       attron()开启属性

       字符输出、、、、、

       attroff()关闭属性

     

    4.输入

         1. 字符输入

           int getch()

           wgetch()

           mvgetch();

           mvwgetch();

           禁止回写:noecho()

          例如:

           char ch;

           ch=getch(5,5);

           mvprintw(3,5,”你输入的是:%c”,ch);

    案例:上下键控制字符移动:

          注意开启功能键keypad(stdscr,TRUE);

          清屏:erase();只是用空白符替代

                clear();全部删除,包含边框

          设置光标的位置:setsyx(int y,int x);

          得到光标的位置:getsyx(int y,int x);

          控制光标是否可见curs_set(int );0不可见,1可见

         

         2.字符串输入

           getstr();

           getnstr();

           wgetstr();

           mvgetstr();

         3.格式数据输入

           scanw();

           wscanw();

           mvscanw();

    5.窗口

          subwin();//创建一个子窗体,坐标采用的标准屏幕的坐标

          derwin();//创建一个子窗体,坐标采用的父屏幕的坐标,参数是:父窗体,行数,列数,                       y ,x,返回值为窗体

     

    案例:

       1.时间显示器:

         睡眠函数sleep(1);,头文件是:#include   #include

       void business()

       {/

         time_t tt;

         struct tm *t;

    while(1)

    {

    //取时间

     tt=time(0);

     t=localtime(&tt);//把时间转化为结构体

         //显示时间

          mvprintw(LINES/2,(COLS-8)/2,”d:d:d”,t->tm_hour,t->tm_min,t->tm_sec;

    refresh();

    sleep(1);     

    }

     

       }

     6.目录相关函数

       chdir 切换目录

       mkdir创建目录

       rmdir 删除目录

       unlink删除文件

       umask 设置文件权限屏蔽位

       stat 文件目录状态

     7.目录的遍历

       头文件:#include <.dirent.h>

       opendir 系列函数

       readdir

       closedir

       dirfd转化为文件描述符

       seekdir

     

    如:

    DIR *d;

    struct dirent *de;

    d=opendir(“..day05”);

    if(d==NULL)

    {

      printf(“opendir:%m\n”);

      exit(-1);

    }

       while(de=readdir(d))

       {

    printf(“%s,\t%d\n”,de->d_name,de->d_type)

       }

       cloesdir(d);

     

       

       int scanddir( cosnt char *dirname,//目录名

    struct dirent***namelist,//目录列表

    int (*)(struct dirent*),//回调函数,用于过滤目录

    int (*) (struct dirent **,)

    );

    转载请注明原文地址: https://ju.6miu.com/read-671300.html

    最新回复(0)