mvhline函数

一: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 **,)


);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值