一、文件IO(IO编程)
系统IO:和系统有关的IO接口函数
标准IO: 标准库里面的IO接口函数 #include
目录操作:操作目录相关的IO接口函数
LCD屏的操作:刷图
TS(touch screen)触摸屏的操作:点击、滑动
二、文件
1.一切皆文件(重点)
一切皆文件,对于linux来说,所有的硬件设备都是文件。比如说你要去操作一个LCD的
硬件屏幕,对于我们应用开发者来说,我们不需要去了解它的寄存器,我们只需要找到
LCd所对应的哪一个文件就可以操作LCD
2.linux系统是怎样去管理它的文件
每一种硬件都对应着一种文件类型,那这么多的硬件对应这各种各样的文件类型;在linux如何
对他们进行管理;所有的硬件文件类型都由VFS来管理;
说明:
有了VFS来同统一管理所有的硬件类型,就可以实现不同格式文件类型之间的内容的交互;
比如你把U盘里面的内容拷贝到电脑的硬盘里面,就是通过VFS来控制协调。
3.在linux中有哪些文件类型7种(重点)
'-':普通文件
'd' :目录文件
'l' :链接文件
'p':管道文件 (系统编程)
's':套接字文件 (网络编程)
'c':字符设备文件
'b':块设备文件
4.文件类型的其它分类
普通文件类型:txt记事本文件、jpg图片文件、tar.gz压缩文件等等
看不见的文件:proc目录下的系统文件,这里面的文件信息是系统文件信息,实时变化,没有权限去修改它
设备文件(硬件文件):这里面的每一个文件描述的都是一个硬件 /dev目录下
三、怎么样来操作文件
系统IO:open、close、read、write、lseek
标准IO:fopen、fclose、fread、fwrite、fseek
四、系统IO---man手册
1.使用man手册来学习系统IO函数
1 Executable programs or shell commands 用来查看普通命令
2 System calls (functions provided by the kernel) 系统调用接口(系统IO)
3 Library calls (functions within program libraries) 库调用接口(标准IO)
4 Special files (usually found in /dev)
5 File formats and conventions eg /etc/passwd
6 Games
7 Miscellaneous (including macro packages and conventions), e.g.
man(7), groff(7)
8 System administration commands (usually only for root)
9 Kernel routines [Non standard]
2.使用方法(3要素)
1)第一步找到它的头文件和函数原型
SYNOPSIS
#include
#include
#include
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
2)第二步看DESCRIPTION描述的第一段话
DESCRIPTION
Given a pathname for a file, open() returns a file descriptor, a small,
(重点找下划线的单词--参数)
3)第三步查看它的返回值
RETURN VALUE
open(), openat(), and creat() return the new file descriptor, or -1 if
五、系统IO
1.open
#include
#include
#include
int open(const char *pathname, int flags);
参数:
pathname: 文件路径名 (字符指针=字符串)
flags:标志量
O_RDONLY, 只读
O_WRONLY, 只写
O_RDWR.可读可写
O_CREAT, If the file does not exist, it will be created如果没有自动创建
返回值:
成功:文件描述符
失败:-1
练习1:
使用open函数自动创建一个2.txt文件
2.文件描述符
练习2:
死循环open函数,打印出文件描述符fd的值,观察它的现象
while(1)
{
fd = open();
printf("fd=%d\n",fd);
}
现象:
1)缺了3个文件描述符的值 0 1 2
2)最大的文件描述符的值是1023
总结:
1)文件描述符的个数只有1024个
2)有3个文件描述符被系统占用 0 1 2
3)开发者创建的文件描述符的值是从3开始的
gec@ubuntu:/mnt/hgfs/GZ2264/6_文件IO/01/code$ vi /usr/include/unistd.h
212 /* Standard file descriptors. */
213 #define STDIN_FILENO 0 /* Standard input. */ -->标准输入 键盘
214 #define STDOUT_FILENO 1 /* Standard output. */ -->标准输出 屏幕
215 #define STDERR_FILENO 2 /* Standard error output. */ -->标准出错 屏幕
练习3:
当前路径下有3个文件1.txt 2.txt 3.txt
fd1 = open("1.txt",O_RDWR) //fd1 = 3
fd2 = open("2.txt",O_RDWR) //fd2 = 4
fd3 = open("3.txt",O_RDWR) //fd3 = 5
2.close
#include
int close(int fd);
参数:
fd:文件描述符
返回值:
成功:0
失败:-1
说明:
如果重复关闭一个描述符,它会失败。
练习4:
当前路径下有3个文件1.txt 2.txt 3.txt
fd1 = open("1.txt",O_RDWR) //fd1 = 3
fd2 = open("2.txt",O_RDWR) //fd2 = 4
fd3 = open("3.txt",O_RDWR) //fd3 = 5
close(fd1);
fd4 = open("1.txt",O_RDWR) //fd4 = 3
fd5 = open("2.txt",O_RDWR) //fd5 = 6
close(fd2);
close(fd3);
fd6 = open("3.txt",O_RDWR) //fd6 = 4
fd7 = open("3.txt",O_RDWR) //fd7 = 5
总结:
文件描述符的值是从数组里面从小到大按照顺序拿,如果没有就往往后面找。
3.read
SYNOPSIS
#include
ssize_t read(int fd, void *buf, size_t count);
参数:
fd:文件描述符
buf:你想要读取的buffer
count:你想要读取的字节数
返回值:
成功:> 0返回实际读到的字节数
=0(zero indicates end offile) 如果是0预示着文件尾
失败:-1(<0)
结论:
读数据的时候,返回值是你实际读到的字节数;并不是想读多少就读多少。当你想读的字节数小于文件里面实际有的字节数的时候,此时count的值和返回值是一样的;当你想读的字节数大于文件里面实际有的字节数的时候,返回值就是文件里面的实际的字节数。