首页
IT
登录
6mi
u
盘
搜
搜 索
IT
mvhline函数
mvhline函数
xiaoxiao
2021-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
)