I/O编程技术(文件IO)笔记纲要梳理
序言
Linux基本知识回顾
Linux内核安全管理机制
根文件系统rootfs
Linux根目录下文件结构
Linux文件类型
标准IO
标准IO操作数据流分析
文件 打开、关闭
fopen( )
fclose( )
文件 字符读写
fgetc( )
fputc( )
文件 行读写
fgets( )
fputs( )
文件 数据快读写
fread( )
fwrite( )
文件 当前位置偏移量 获取 设置
ftell( )
fseek( )
rewind( )
文件 状态判断
feof( )、ferror( )
标准输入设备 读取、输出
getchar( )
putchar( )
时间函数
time( )
localtime( )
刷新缓冲区
fflush( )
系统IO
打开关闭
open( )
close( )
数据读写
read( )
write( )
文件位置偏移量
lseek( )
内存映射
mmap( )
实践开发
LCD屏幕显像原理
驱动架构
软件层
LCD内核源码
文件控制
ioctl( ) 文件控制
mmap( )内存映射
munmap()解除映射
屏幕显示
BMP图像的储存
其它函数
sscanf( )
描述
声明
参数
返回值
strcmp( )
remove()
getchar()
strftime()
atoi()
参考文档
序言
尽可能压缩笔记,核心在于构建核心知识单元网络。
Linux基本知识回顾
Linux内核安全管理机制
根文件系统rootfs
Linux根目录下文件结构
Linux文件类型
-(regular) 普通文件
d(directory) 目录文件
p(pipe) 管道文件
s(socket) 套接字文件
l(link) 链接文件
c(character) 字符设备文件
b(block) 块设备文件
标准IO
标准IO操作数据流分析
文件操作接口
文件 打开、关闭
fopen( )
加b是以二进制处理
fclose( )
文件 字符读写
fgetc( )
fputc( )
文件 行读写
fgets( )
fputs( )
文件 数据快读写
fread( )
fwrite( )
字符串要用strlen函数,sizeof(“字符串”)得到的是地址一个字长。
文件 当前位置偏移量 获取 设置
ftell( )
相较于文件开头的字节数
fseek( )
rewind( )
rewind(fp)相等于fseek(fp, 0L, SEEK_SE);
文件 状态判断
feof( )、ferror( )
标准输入设备 读取、输出
getchar( )
getchar( )缺省从标准输入设备读取一个字符。
putchar( )
putchar( )缺省从标准输出设备输出一个字符。
时间函数
time( )
获取1970至今的秒数
localtime( )
转换timer的值为tm结构 后的值
刷新缓冲区
fflush( )
刷新全缓冲
系统IO
api:应用程序编程接口
sdk:软件开发工具包
标准I/O可以看成是在系统I/O的基础上封装了缓冲机制。
文件描述符是一个小的非负整数。
打开关闭
open( )
close( )
数据读写
read( )
write( )
文件位置偏移量
lseek( )
内存映射
mmap( )
实践开发
LCD屏幕显像原理
偏光片、彩色滤光片
像素数量、
像素色深(位深度、色域) : bit-->4Bytes-->ARGB
驱动架构
Framebuffer驱动子系统
粤嵌屏幕分辨率 800*480。
ll: c或b开头的都是硬件设备驱动提供的文件
设备文件在/dev/fb0
软件层
LCD内核源码
要看内核源码
Linux最多支持32块(编号0~31)LCD屏幕.
文件控制
ioctl( ) 文件控制
该函数是一个专用于设备输入输出操作的系统调用,该调用传入一个跟设备有关的请求码,系统调用的功能完全取决于请求码。
ioctl(文件描述符,请求码,某类型指针) 可以获取或设置硬件设备的参数
#include <sys/ioctl.h>
int ioctl(int fd, unsigned long request, ...);
下面我们解释各个参数的含义。
1)fd是文件描述符。当我们的设备作为特殊文件被open()函数打开后,会返回一个文件描述符,通过操作这个文件描述符达到操作设备文件的目的。
2)request是命令码,应用程序通过下发命令码来控制驱动程序完成对应操作。
3)第三个参数“…”是可变参数arg,一些情况下应用程序需要向驱动程序传参,参数就通过ag来传递。ioctl函数中的“…”只能传递一个参数,但内核不会检查这个参数的类型。那么,就有两种传参方式:只传一个整数,传递一个指针。
如果ioctl执行成功,它的返回值就是驱动程序中ioctl接口给的返回值,驱动程序可以通过返回值向用户程序传参。但驱动程序最好返回一个非负数,因为用户程序中的ioctl运行失败时一定会返回-1并设置全局变量errorno。
errono不同的值代表的含义如下:
EBADF:fd是一个无效的文件描述符。
EFAULT:在arg是指针的前提下,argp指向一个不可访问的内存空间。
EINVAL:request或argp是无效的。
ENOTTY:fd没有关联到一个字符特殊设备,或该request不适用于文件描述符fd引用的对象类型。(说人话就是fd没有指向一个字符设备,或fd指向的文件不支持ioctl操作)
因此,在用户空间调用ioctl时,可以使用如下的错误判断处理。包括的两个头文件,string.h声明了strerror函数,errno.h定义了错误码errno。
#include <string.h>
#include <errno.h>
int ret;
ret = ioctl(fd, MYCMD);
if (ret == -1)
printf("ioctl: %s\n", strerror(errno));
mmap( )内存映射
munmap()解除映射
#include <sys/mman.h>
int munmap(void *addr, size_t length);
munmap()系统调用解除指定地址范围内的映射,参数 addr 指定待解除映射地址范围的起始地址,它必须是系统页大小的整数倍;参数 length 是一个非负整数,指定了待解除映射区域的大小(字节数),被解除映射的区域对应的大小也必须是系统页大小的整数倍,即使参数 length 并不等于系统页大小的整数倍,与 mmap()函数相似。
需要注意的是,当进程终止时也会自动解除映射(如果程序中没有显式调用 munmap()),但调用 close() 关闭文件时并不会解除映射。
通常将参数 addr 设置为 mmap()函数的返回值,将参数 length 设置为 mmap()函数的参数 length,表示解除整个由 mmap()函数所创建的映射。
屏幕显示
BMP图像的储存
BMP图像内存采用小端存储.
其它函数
sscanf( )
描述
C 库函数 int sscanf(const char *str, const char *format, ...) 从字符串读取格式化输入。
声明
下面是 sscanf() 函数的声明。
int sscanf(const char *str, const char *format, ...)
参数
- str -- 这是 C 字符串,是函数检索数据的源。
- format -- 这是 C 字符串,包含了以下各项中的一个或多个:空格字符、非空格字符 和 format 说明符。
format 说明符形式为 [=%*[modifiers]type=],具体讲解如下:
参数 | 描述 |
---|---|
* | 这是一个可选的星号,表示数据是从流 stream 中读取的,但是可以被忽视,即它不存储在对应的参数中。 |
width | 这指定了在当前读取操作中读取的最大字符数。 |
modifiers | 为对应的附加参数所指向的数据指定一个不同于整型(针对 d、i 和 n)、无符号整型(针对 o、u 和 x)或浮点型(针对 e、f 和 g)的大小: h :短整型(针对 d、i 和 n),或无符号短整型(针对 o、u 和 x) l :长整型(针对 d、i 和 n),或无符号长整型(针对 o、u 和 x),或双精度型(针对 e、f 和 g) L :长双精度型(针对 e、f 和 g) |
type | 一个字符,指定了要被读取的数据类型以及数据读取方式。具体参见下一个表格。 |
sscanf 类型说明符:
类型 | 合格的输入 | 参数的类型 |
---|---|---|
c | 单个字符:读取下一个字符。如果指定了一个不为 1 的宽度 width,函数会读取 width 个字符,并通过参数传递,把它们存储在数组中连续位置。在末尾不会追加空字符。 | char * |
d | 十进制整数:数字前面的 + 或 - 号是可选的。 | int * |
e,E,f,g,G | 浮点数:包含了一个小数点、一个可选的前置符号 + 或 -、一个可选的后置字符 e 或 E,以及一个十进制数字。两个有效的实例 -732.103 和 7.12e4 | float * |
o | 八进制整数。 | int * |
s | 字符串。这将读取连续字符,直到遇到一个空格字符(空格字符可以是空白、换行和制表符)。 | char * |
u | 无符号的十进制整数。 | unsigned int * |
x,X | 十六进制整数。 | int * |
- 附加参数
- -- 这个函数接受一系列的指针作为附加参数,每一个指针都指向一个对象,对象类型由 format 字符串中相应的 % 标签指定,参数与 % 标签的顺序相同。
- 针对检索数据的 format 字符串中的每个 format 说明符,应指定一个附加参数。如果您想要把 sscanf 操作的结果存储在一个普通的变量中,您应该在标识符前放置引用运算符(&),例如:
- int n;
sscanf (str,"%d",&n);
返回值
如果成功,该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回 EOF。
strcmp( )
C 库函数 int strcmp(const char *str1, const char *str2) 把 str1 所指向的字符串和 str2 所指向的字符串进行比较。
声明
下面是 strcmp() 函数的声明。
int strcmp(const char *str1, const char *str2)
参数
- str1 -- 要进行比较的第一个字符串。
- str2 -- 要进行比较的第二个字符串。
返回值
该函数返回值如下:
- 如果返回值小于 0,则表示 str1 小于 str2。
- 如果返回值大于 0,则表示 str1 大于 str2。
- 如果返回值等于 0,则表示 str1 等于 str2。
remove()
描述
C 库函数 int remove(const char *filename) 删除给定的文件名 filename,以便它不再被访问。
声明
下面是 remove() 函数的声明。
int remove(const char *filename)
参数
- filename -- 这是 C 字符串,包含了要被删除的文件名称。
返回值
如果成功,则返回零。如果错误,则返回 -1,并设置 errno。
getchar()
描述
C 库函数 int getchar(void) 从标准输入 stdin 获取一个字符(一个无符号字符)。这等同于 getc 带有 stdin 作为参数。
声明
下面是 getchar() 函数的声明。
int getchar(void)
参数
- NA
返回值
该函数以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或发生读错误,则返回 EOF。
strftime()
描述
C 库函数 size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr) 根据 format 中定义的格式化规则,格式化结构 timeptr 表示的时间,并把它存储在 str 中。
声明
下面是 strftime() 函数的声明。
size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr)
参数
- str -- 这是指向目标数组的指针,用来复制产生的 C 字符串。
- maxsize -- 这是被复制到 str 的最大字符数。
- format -- 这是 C 字符串,包含了普通字符和特殊格式说明符的任何组合。这些格式说明符由函数替换为表示 tm 中所指定时间的相对应值。格式说明符是:
说明符 | 替换为 | 实例 |
---|---|---|
%a | 缩写的星期几名称 | Sun |
%A | 完整的星期几名称 | Sunday |
%b | 缩写的月份名称 | Mar |
%B | 完整的月份名称 | March |
%c | 日期和时间表示法 | Sun Aug 19 02:56:02 2012 |
%d | 一月中的第几天(01-31) | 19 |
%H | 24 小时格式的小时(00-23) | 14 |
%I | 12 小时格式的小时(01-12) | 05 |
%j | 一年中的第几天(001-366) | 231 |
%m | 十进制数表示的月份(01-12) | 08 |
%M | 分(00-59) | 55 |
%p | AM 或 PM 名称 | PM |
%S | 秒(00-61) | 02 |
%U | 一年中的第几周,以第一个星期日作为第一周的第一天(00-53) | 33 |
%w | 十进制数表示的星期几,星期日表示为 0(0-6) | 4 |
%W | 一年中的第几周,以第一个星期一作为第一周的第一天(00-53) | 34 |
%x | 日期表示法 | 08/19/12 |
%X | 时间表示法 | 02:50:06 |
%y | 年份,最后两个数字(00-99) | 01 |
%Y | 年份 | 2012 |
%Z | 时区的名称或缩写 | CDT |
%% | 一个 % 符号 | % |
- timeptr
-- 这是指向 tm 结构的指针,该结构包含了一个被分解为以下各部分的日历时间:
struct tm {
int tm_sec; /* 秒,范围从 0 到 59 */
int tm_min; /* 分,范围从 0 到 59 */
int tm_hour; /* 小时,范围从 0 到 23 */
int tm_mday; /* 一月中的第几天,范围从 1 到 31 */
int tm_mon; /* 月份,范围从 0 到 11 */
int tm_year; /* 自 1900 起的年数 */
int tm_wday; /* 一周中的第几天,范围从 0 到 6 */
int tm_yday; /* 一年中的第几天,范围从 0 到 365 */
int tm_isdst; /* 夏令时 */
};
返回值
如果产生的 C 字符串小于 size 个字符(包括空结束字符),则会返回复制到 str 中的字符总数(不包括空结束字符),否则返回零。
atoi()
描述
C 库函数 int atoi(const char *str) 把参数 str 所指向的字符串转换为一个整数(类型为 int 型)。
声明
下面是 atoi() 函数的声明。
int atoi(const char *str)
参数
- str -- 要转换为整数的字符串。
返回值
该函数返回转换后的长整数,如果没有执行有效的转换,则返回零。
参考文档
本文来自博客园,作者:舟清颺,转载请注明原文链接:https://www.cnblogs.com/zqingyang/p/18218543