星计划打卡38天
===========
LCD每个像素显示的数据来自于显存,嵌入式中显存直接使用内存,也就是利用一段内存空间来存储显示数据。当显存和LCD建立映射关系,往显存上写什么数据,LCD就显示对应的内容。由于历史原因,LCD按行扫描。
显存在内核中,用户空间不能直接访问,需要将显存映射到用户空间才能访问,使用mmap函数实现映射。#include
void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);
参数:
addr - 映射内存的首地址,给NULL表示由系统选择映射地址
length - 映射区长度(是页的倍数)
prot - 映射区访问权限
PROT_READ:可读
PROT_WRITE:可写
PROT_EXEC:可执行
PROT_NONE:无权限
flags - 映射标志
MAP_SHARED:对映射区的修改要同步到文件
MAP_PRIVATE:对映射区的修改要不同步到文件
MAP_ANONYMOUS:映射物理内存
fd - 映射文件的描述符
offset - 映射位置离文件开头的距离
返回值:
成功返回映射区首地址,失败MAP_FAILE https://t.cn/z8AFbuu
===========
LCD每个像素显示的数据来自于显存,嵌入式中显存直接使用内存,也就是利用一段内存空间来存储显示数据。当显存和LCD建立映射关系,往显存上写什么数据,LCD就显示对应的内容。由于历史原因,LCD按行扫描。
显存在内核中,用户空间不能直接访问,需要将显存映射到用户空间才能访问,使用mmap函数实现映射。#include
void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);
参数:
addr - 映射内存的首地址,给NULL表示由系统选择映射地址
length - 映射区长度(是页的倍数)
prot - 映射区访问权限
PROT_READ:可读
PROT_WRITE:可写
PROT_EXEC:可执行
PROT_NONE:无权限
flags - 映射标志
MAP_SHARED:对映射区的修改要同步到文件
MAP_PRIVATE:对映射区的修改要不同步到文件
MAP_ANONYMOUS:映射物理内存
fd - 映射文件的描述符
offset - 映射位置离文件开头的距离
返回值:
成功返回映射区首地址,失败MAP_FAILE https://t.cn/z8AFbuu
#粤嵌科技停课不停学 #粤嵌星计划 day08
今日笔记:
标准IO
==========================
区别一:
系统IO采用文件描述符表示文件
标准IO采用FILE指针表示文件
区别二:
系统IO 012
#define STDIN_FILENO 0
#define STDOUT_FILENO 1
#define STDERR_FILENO 2
标准IO stdinstdoutstderr
区别三:
系统IO,无缓冲区
标准IO,缓冲区
系统IO用文件描述符表示文件
标准IO用FILE *表示文件
1.文件打开
FILE *fopen( const char *pathname,const char *mode);
返回值:成功 返回FILE类型指针(保存属性信息)
失败 NULL
参数:pathname->文件路径名
mode->r 只读
r+ 可读可写
w只写
w+ 可读可写,若文件不存在则创建,存在则清空覆盖
a 以只写的方式在文件末尾追加
a+ 以可读写的方式在文件末尾追加
2.文件读写
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
返回值(重点): 成功 返回读取到的完整的数据块的个数
失败 -1
参数:ptr --》存放你读取的内容
size(重点) --》你要读取的数据块大小,字节
nmemb(重点) --》你打算读取多少个数据块
stream --》你要读取的那个文件
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
返回值(重点): 成功nmemb是多少,返回值就是多少
3.文件的关闭
int fclose(FILE *stream);
4.文件偏移设置
int fseek(FILE *stream, long offset, int whence);
返回值:跟lseek不一样,成功 0失败 -1
long ftell(FILE *stream);
返回值:成功 返回当前位置距离起始位置的字节数
void rewind(FILE *stream); //等价于 fseek(filep,0,SEEK_SET);
将文件偏移挪到起始位置
5.fgets fputsfgetcfputcgets puts
char *fgets(char *s, int size, FILE *stream); //按行读取数据,一次最多读取一行(遇到回车结束读取)
返回值:成功 返回读取的一行数据的首地址
失败 NULL
参数:s --》存放读取到的一行数据
size --》你打算读取多少字节的数据
stream --》你要从哪个文件读取一行
int fputs(const char *s, FILE *stream);
返回值:成功 >0失败 EOF
int fgetc(FILE *stream); //按字符读取数据,一次只能读取一个字节的数据
返回值:读取到的那个字符的ASCII码值
失败 -1
int fputc(int c, FILE *stream); //把c这个字符写入到stream表示的文件中
char *gets(char *s); //只能读取键盘输入的字符串,把字符串保存到s中
int puts(const char *s) //把s这个字符串在标准输出上打印出来
6.判断是否到达文件末尾
int feof(FILE *stream);
返回值: 1 表示达到文件末尾
7.sprintf和sscanf()
int sprintf(char *str, const char *format, ...);//字符串拼接
参数:str,拼接之后的字符串
int sscanf(const char *str, const char *format, ...); //字符串拆分
参数:str,要拆分的字符串
fprintf和fscanf()
int fprintf(FILE *stream, const char *format, ...);//按指定格式,字符串拼接之后写入文件
int fscanf(FILE *stream, const char *format, ...);//按指定格式,从文件里读取字符串然后拆分存入
8.主动刷新缓冲区
先写入缓冲区,
1)当缓冲区满了或者刷新缓冲区(遇到\0)时,才从缓冲区中读出
2)当主函数return退出时,也会刷新
int fflush(FILE *stream)//自动刷新缓冲区
目录操作
===============
1.相关的接口函数
(1)打开目录
#include
DIR *opendir(const char *name);
返回值: 成功 返回DIR指针表示你打开的那个目录
失败 NULL
参数:name->目录路径名
(2)读取目录(重点)
struct dirent *readdir(DIR *dirp);->opendir的返回值
返回值:成功->struct dirent {
ino_t d_ino; /* 节点编号 */
off_t d_off; /* 文件偏移位置 */
unsigned short d_reclen; /* 记录大小 */
unsigned char d_type; https://t.cn/R2WxELY
今日笔记:
标准IO
==========================
区别一:
系统IO采用文件描述符表示文件
标准IO采用FILE指针表示文件
区别二:
系统IO 012
#define STDIN_FILENO 0
#define STDOUT_FILENO 1
#define STDERR_FILENO 2
标准IO stdinstdoutstderr
区别三:
系统IO,无缓冲区
标准IO,缓冲区
系统IO用文件描述符表示文件
标准IO用FILE *表示文件
1.文件打开
FILE *fopen( const char *pathname,const char *mode);
返回值:成功 返回FILE类型指针(保存属性信息)
失败 NULL
参数:pathname->文件路径名
mode->r 只读
r+ 可读可写
w只写
w+ 可读可写,若文件不存在则创建,存在则清空覆盖
a 以只写的方式在文件末尾追加
a+ 以可读写的方式在文件末尾追加
2.文件读写
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
返回值(重点): 成功 返回读取到的完整的数据块的个数
失败 -1
参数:ptr --》存放你读取的内容
size(重点) --》你要读取的数据块大小,字节
nmemb(重点) --》你打算读取多少个数据块
stream --》你要读取的那个文件
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
返回值(重点): 成功nmemb是多少,返回值就是多少
3.文件的关闭
int fclose(FILE *stream);
4.文件偏移设置
int fseek(FILE *stream, long offset, int whence);
返回值:跟lseek不一样,成功 0失败 -1
long ftell(FILE *stream);
返回值:成功 返回当前位置距离起始位置的字节数
void rewind(FILE *stream); //等价于 fseek(filep,0,SEEK_SET);
将文件偏移挪到起始位置
5.fgets fputsfgetcfputcgets puts
char *fgets(char *s, int size, FILE *stream); //按行读取数据,一次最多读取一行(遇到回车结束读取)
返回值:成功 返回读取的一行数据的首地址
失败 NULL
参数:s --》存放读取到的一行数据
size --》你打算读取多少字节的数据
stream --》你要从哪个文件读取一行
int fputs(const char *s, FILE *stream);
返回值:成功 >0失败 EOF
int fgetc(FILE *stream); //按字符读取数据,一次只能读取一个字节的数据
返回值:读取到的那个字符的ASCII码值
失败 -1
int fputc(int c, FILE *stream); //把c这个字符写入到stream表示的文件中
char *gets(char *s); //只能读取键盘输入的字符串,把字符串保存到s中
int puts(const char *s) //把s这个字符串在标准输出上打印出来
6.判断是否到达文件末尾
int feof(FILE *stream);
返回值: 1 表示达到文件末尾
7.sprintf和sscanf()
int sprintf(char *str, const char *format, ...);//字符串拼接
参数:str,拼接之后的字符串
int sscanf(const char *str, const char *format, ...); //字符串拆分
参数:str,要拆分的字符串
fprintf和fscanf()
int fprintf(FILE *stream, const char *format, ...);//按指定格式,字符串拼接之后写入文件
int fscanf(FILE *stream, const char *format, ...);//按指定格式,从文件里读取字符串然后拆分存入
8.主动刷新缓冲区
先写入缓冲区,
1)当缓冲区满了或者刷新缓冲区(遇到\0)时,才从缓冲区中读出
2)当主函数return退出时,也会刷新
int fflush(FILE *stream)//自动刷新缓冲区
目录操作
===============
1.相关的接口函数
(1)打开目录
#include
DIR *opendir(const char *name);
返回值: 成功 返回DIR指针表示你打开的那个目录
失败 NULL
参数:name->目录路径名
(2)读取目录(重点)
struct dirent *readdir(DIR *dirp);->opendir的返回值
返回值:成功->struct dirent {
ino_t d_ino; /* 节点编号 */
off_t d_off; /* 文件偏移位置 */
unsigned short d_reclen; /* 记录大小 */
unsigned char d_type; https://t.cn/R2WxELY
#粤嵌科技停课不停学 #粤嵌星计划 day07
今日笔记:
1.怎么从中间开始读写文件?(文件读写偏移)
设置文件的读写偏移
off_t lseek(int fd,off_t offset,int whence);
返回值:成功,目前偏移量距离起始位置的字节数
失败,-1
参数:fd :文件描述符
offset:偏移多少个字节
whence:SEEK_SET //起始位置
SEEK_CUR//当前位置
SEEK_END //末尾位置
用lseek求文件大小
int size=lseek(fd,0,SEEK_END);
int ret2=lseek(fd,5,SEEK_SET);//起始往后5
目前偏移量为:5,读取的内容:world!china No.1
int ret2=lseek(fd,-5,SEEK_SET);(失败了)//起始往前5
目前偏移量为:-1,读取的内容:
int ret2=lseek(fd,5,SEEK_CUR);//当前位置往后5
目前偏移量为:26,读取的内容:
int ret2=lseek(fd,-5,SEEK_CUR);//当前位置往后5
目前偏移量为:16,读取的内容: No.1
int ret2=lseek(fd,5,SEEK_END);//末尾位置往前5
目前偏移量为:30,读取的内容:
int ret2=lseek(fd,-5,SEEK_END);//末尾位置往后5
目前偏移量为:20,读取的内容:1
往前偏移不了就不动。还在原来位置。
2.获取文件的属性信息
#include
int stat(const char *pathname,struct stat *statbuf);
返回值:成功 0 失败 -1
参数:pathname,文件路径名
statbuf,存放信息
常用:st_size->文件大小
st_mode->文件类型(7种)
st_mode&S_IFMT
文件权限信息(r w x)
if(st_mode&S_IRUSR)//当前用户可读的
S_IRWXU//当前用户
S_IRWXG //同组用户
S_IRWXO //其它用户
S_IRUSR//同组用户,其它用户只是单词缩写不一样
S_IWUSR
S_IXUSR
3.修改文件权限
int chmod(const char *pathname,mode_t mode);
返回值:
参数:pathname,文件路径名
mode,权限0777 0654
4.分析函数出错的原因
void perror(const char *s);//会自动分析出错原因
系统定义了一个全局变量errno记录错误原因
原理:linux把所有的错误定义成宏,perror依据全局变量errno中的数字编号,查询宏定义,分析错误原因
进一步判断:
if(errno==错误编码/名称)//然后根据错误再处理 https://t.cn/ReN5aUi
今日笔记:
1.怎么从中间开始读写文件?(文件读写偏移)
设置文件的读写偏移
off_t lseek(int fd,off_t offset,int whence);
返回值:成功,目前偏移量距离起始位置的字节数
失败,-1
参数:fd :文件描述符
offset:偏移多少个字节
whence:SEEK_SET //起始位置
SEEK_CUR//当前位置
SEEK_END //末尾位置
用lseek求文件大小
int size=lseek(fd,0,SEEK_END);
int ret2=lseek(fd,5,SEEK_SET);//起始往后5
目前偏移量为:5,读取的内容:world!china No.1
int ret2=lseek(fd,-5,SEEK_SET);(失败了)//起始往前5
目前偏移量为:-1,读取的内容:
int ret2=lseek(fd,5,SEEK_CUR);//当前位置往后5
目前偏移量为:26,读取的内容:
int ret2=lseek(fd,-5,SEEK_CUR);//当前位置往后5
目前偏移量为:16,读取的内容: No.1
int ret2=lseek(fd,5,SEEK_END);//末尾位置往前5
目前偏移量为:30,读取的内容:
int ret2=lseek(fd,-5,SEEK_END);//末尾位置往后5
目前偏移量为:20,读取的内容:1
往前偏移不了就不动。还在原来位置。
2.获取文件的属性信息
#include
int stat(const char *pathname,struct stat *statbuf);
返回值:成功 0 失败 -1
参数:pathname,文件路径名
statbuf,存放信息
常用:st_size->文件大小
st_mode->文件类型(7种)
st_mode&S_IFMT
文件权限信息(r w x)
if(st_mode&S_IRUSR)//当前用户可读的
S_IRWXU//当前用户
S_IRWXG //同组用户
S_IRWXO //其它用户
S_IRUSR//同组用户,其它用户只是单词缩写不一样
S_IWUSR
S_IXUSR
3.修改文件权限
int chmod(const char *pathname,mode_t mode);
返回值:
参数:pathname,文件路径名
mode,权限0777 0654
4.分析函数出错的原因
void perror(const char *s);//会自动分析出错原因
系统定义了一个全局变量errno记录错误原因
原理:linux把所有的错误定义成宏,perror依据全局变量errno中的数字编号,查询宏定义,分析错误原因
进一步判断:
if(errno==错误编码/名称)//然后根据错误再处理 https://t.cn/ReN5aUi
✋热门推荐