文件IO(IO编程)

一、文件IO(IO编程)
系统IO:和系统有关的IO接口函数
标准IO: 标准库里面的IO接口函数 #include
目录操作:操作目录相关的IO接口函数
LCD屏的操作:刷图
TS(touch screen)触摸屏的操作:点击、滑动

二、文件
1.一切皆文件(重点)
 一切皆文件,对于linux来说,所有的硬件设备都是文件。比如说你要去操作一个LCD的
硬件屏幕,对于我们应用开发者来说,我们不需要去了解它的寄存器,我们只需要找到
LCd所对应的哪一个文件就可以操作LCD

2.linux系统是怎样去管理它的文件
 每一种硬件都对应着一种文件类型,那这么多的硬件对应这各种各样的文件类型;在linux如何
对他们进行管理;所有的硬件文件类型都由VFS来管理;
说明:
有了VFS来同统一管理所有的硬件类型,就可以实现不同格式文件类型之间的内容的交互;
比如你把U盘里面的内容拷贝到电脑的硬盘里面,就是通过VFS来控制协调。

文件IO(IO编程)_第1张图片

 

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

文件IO(IO编程)_第2张图片

 

练习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的值和返回值是一样的;当你想读的字节数大于文件里面实际有的字节数的时候,返回值就是文件里面的实际的字节数。
 

你可能感兴趣的:(文件IO,linux,运维,服务器)