1.文件IO
2.标准IO
3.动静态库的制作
4.目录IO
文件IO简介
涉及哪些接口?
Input ,Output
是从用户空间角度考虑的输入与输出:
从内核读取数据或从文件中读取数据,叫:input read函数
写数据到内核或写数据到文件中,叫:output write函数
内核中有很多文件,应该写到哪一个文件中呢,或从哪一个文件中读呢?
(内核应该负责管理这些文件-文件管理)
因此在写入或读出之前用户应该指定某个文件,即要创建或打开某个文件
即:read ,write 这二个函数应该有一个参数是指定某个文件
Read或write 函数之前有一个函数: open
操作之后,还要关闭这些文件 close
open – 打开或创建一个文件
open(char *, flag, mode)在fcntl.h文件中声明。函数的作用:创建或打开某个文件,参数:最多有三个参数;
第一个参数,char * 包含有文件名和路径
第二个参数:flag 打开文件的方式
第三个参数:mode 创建文件的权限。
flag内容如下:
flag 功能
O_RDONLY 只读
O_WRONLY 只写
O_RDWR 读写
O_CREAT 创建一个文件
O_EXCL 如果使用O_CREAT时文件存在,则可返回错误消息(返回-1)。如果没使用O_CREAT,那么不管打开的文件存不存在,都会创建一个新的文件,这一 参数可测试文件是否存在。
O_TRUNC 打开文件(会把已经存在的内容给删除)。
O_APPEND 追加方式打开文件(不会把已经存在的内容给删除)。
返回值:
成功:文件描述符,它是一个非负的正整数,即文件的ID号,相当于人的身份证号;
出错:-1。
Open 函数创建文件时的权限是:
mode & (~umask)
B111 111 111 & ~(B 000 010 010) = B 111 101 101
umask是掩码,我们可以通过
umask 掩码值(4位八进制)来修改
什么是文件描述符?
内核的一个重要功能是文件管理,系统有非常多的文件,内核怎样认识每一个文件呢?内核采用ID号的方式标识这些文件,inode 号,node号表示不同的文件,比如ls –lai i,在一个进程下只要文件不一样,inode号就不一样。
那么这些内核的文件的ID号,在每个用户的程序中怎样映射的呢?即是文件描述符。
open函数的返回值就是这个ID号
ID号有什么规律呢?
从0开始累加,
程序进行时(进程),内核会自动打开3个文件描述符,0,1,2,分别对应,标准输入、输出和出错,这样在程序中,每打开一个文件,文件描述符值从3开始累加。
write(int fd, void *buf, size_t count ):
第一个参数:向哪一个文件中去写;第二个参数:向这个文件中写什么内容;第三个参数:向这个文件中写多少个。函数的返回值:是实际写的字节数。
返回值:是实际写的字节数
read(int fd, void *buf, size_t count)
第一个参数:从哪一个文件中去读;第二个参数:读到什么地方去;第三个参数:读多少个。函数的返回值:是实际读的字节数。
返回值:是实际读的字节数
上面这个程序是无法把程序读出来的,因为我们在对文件进行写操作的时候,文件指针已经指向最后,读的时候会接着文件指针读,所以就读不出来东西
leek(int fd, off_t offset, int whence),
该函数的头文件:sys/types.h unistd.h;
功能:调整读写的位置指针;
第一个参数:要调整的文件的文件描述符;
第二个参数:偏移量,每一读写操作所需要移动的距离,单位是字节的数量,可正可负(向前移,向后移);
第三个参数:当前位置的基点,有三个标志,
SEEK_SET:当前位置为文件的开头,新位置为偏移量的大小;
SEEK_CUR:当前位置为文件指针的位置,新位置为当前位置加上偏移量。
SEEK_END:当前位置为文件的结尾,新位置为文件的大小加上偏移量的大小。函
数的
返回值:成功:文件当前的位置,出错:-1。
5.close(fd),
调用close()函数可以关闭一个打开的文件。
调用成功返回0,出错返回-1,并设置errno;
注:当一个进程终止时,该进程打开的所有文件都由内核自动关闭;
如果lseek这么使用的话那么会读到:llo linux
例子:拷贝文件==》cp命令的实现