目录
一、文件IO
1.文件IO的分类
文件IO可分为,系统IO和标准IO两种,标准IO是在系统IO的基础上引入了一个用户buff,加入这个buff的作用是让程序不用频繁的访问内核。
2.函数原型
2.1系统调用接口
注意:使用read()函数读取文件,假如你第一次使用这个函数读取了三个字节,他的位置会更新,也就是你下次在进行读取的时候,不是又从头开始读,而是从上一次的位置开始读。这一现象在read函数的返回值中也可以体现,如果你想读100个字节但是返回值是50,这不是也错误而是可能文件已经读到尾部了,read函数的错误返回值永远是-1.
1.open函数
函数原型:
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
入参:
pathname 打开/创建的文件名
flags 文件的打开模式,常用O_RDONLY, O_WRONLY, O_RDWR
mode 创建文件时需要指定,用来设置创建文件的权限(rwx)
回参:
返回值类型:int
调用成功时返回一个文件描述符fd
调用失败时返回-1,并设置errno
2.read函数
函数原型:
ssize_t read(int fd, void *buf, size_t count);
入参:
fd 即将读取文件的文件描述符
buf 存储读入数据的缓冲区
count 将要读入的数据的个数
回参:
返回值类型是:ssize_t,32位机上等同于int
成功时返回读取的字节数
出错时返回EOF,读到文件末返回0
3.write函数
函数原型:
ssize_t write(int fd, const void *buf, size_t count);
入参:
fd 即将读取文件的文件描述符
buf 要写入的数据缓冲区
count 写入数据的个数,大小不应该大于buf大小
回参:
回值类型为:ssize_t
成功时返回写入的字节数
出错时返回EOF,读到文件末返回0
4.close函数
函数原型:
int close(int fd);
入参:
fd: 要关闭的文件描述符。
回参:
关闭成功时返回0,出错时返回EOF.。
2.2文件IO综合实验
hexdump -C可以以十六进制的方式查看文件
思路:
第一步:当然是使用open函数打开两个文件了,对于原数据文件只需要通过只读的方式打开,对于目标文件就需要读写、创建以及截断。
第二步:一行一行的读取数据,重点是怎么判读是否读取完一行(通过判断\r\n),还有怎么判断是读取完了一行还是读取完了整个文件(读到文件尾部了并且一个数据都没有读进来)。
第三步:每读取一行就对读取到的数据进行处理。在处理数据过程中需要注意的就是,所以当我们判断第一行的时候,不是直接判断逗号,而是0xef,因为第一行的数据不需要我们改写,可以直接使用strcpy方法,之后的数据可以借助sscanf方法进行处理,将数据分割开来,然后相加就可以得出结果了。
最后,就是使用write函数将处理好的数据写入目标文件。
结果:
原数据文件
执行后的目标文件
这里第一行没显示出来是因为我把strcpy两个参数写反了,第一个参数应该是目标文件,第二个参数是原数据文件。
2.3文件IO 系统调用内部机制
app----->glibc来-------->Linux内核
app调用函数,glibc就会设置原因通过触发异常(swi、svc)的方式调用这些接口,系统接收到异常就会处理异常
可以参考手册第四篇第四章4.4
2.4dup函数
补充:
对于课程中给出的通用Makefile文件,怎么去使用。
我们需要指定去编译哪些文件那些目录,这是通过修改obj-y这一变量去指定的,编译在其他目录下的文件,先是要指定那个目录,然后再在那个目录下创建一个Makefile文件,也是要通过obj-y这个变量去添加编译文件。
————所学课程为百问网韦老师的《手把手教你嵌入式Linux快速入门到精通 | Linux应用驱动开发基于I.MX6ULL/STM32MP157/T113/D1H开发板》