文件描述符是一个非负整数,在读写一个文件前,先调用open或者creat函数打开文件,成功返回文件描述符。文件描述符的范围在0~NR_OPEN之间,Linux中的NR_OPEN为255,说明每个程序最多只能打开256个文件。文件描述符0代表标准输入文件,1代表标准输出文件,2代表标准错误输出。
一、 文件的创建与打开 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 可读可写方式打开 O_CREAT 若文件不存在就自动创建该文件 O_EXCL 如果O_CREAT被设置,这个指令会去检查文件是否存在,不存在则会创建该文件,存在则会导致打开文件出错。 O_TRUNC 若文件存在并以可写的方式打开,这个命令会将文件长度清0 O_APPEND 将所写内容以追加的方式加入到文件后面 O_SYNC 以同步的方式打开文件
creat函数 函数原型: int create(const char *pathname, mode_t mode) pathname是要打开或创建的含路径的文件名,如果pathname指向的文件不存在,就会创建一个新文件,若原文件存在,则原文件会被覆盖,mode与open函数相同,create( )相当于这样使用open(): open(const char*pathname, (O_CREAT|O_WRONLY|O_TRUNC)); 成功会返回一个文件描述符,错误会返回-1,将错误代码给errno。
close函数 函数原型: int close(fd); 该函数只有一个参数,fd表示要关闭文件的文件描述符,该描述符是由open 或者creat函数得到的。调用成功返回值为0,错误返回-1。close函数成功并不能保证数据全部写回硬盘。 最好在程序中显示的调用close函数。
2 #include<stdio.h> 3 #include<sys/types.h> 4 #include<sys/stat.h> 5 #include<fcntl.h> 6 #include<unistd.h> 7 #include<errno.h> 8 9 //用open或creat系统调用来创建一个新文件 10 int main() 11 { 12 int fd; 13 if((fd = open("example_62.c",O_CREAT|O_EXCL,S_IRUSR|S_IWUSR)) == -1) 14 { 15 perror("open"); 16 exit(1); 17 } 18 else 19 { 20 printf("create file success\n"); 21 } 22 close(fd); 23 return 0; 24 } -- 可视 -- 24,2 底端二、 文件的读写 1. read函数 函数原型: size_t read(int fd, void *buf, size_t count) 函数中各参数的意义:从文件描述符fd所指向的文件中读取count个字节的数据到buff所指向的缓存中,若count为0,read()函数不会读取数据,只返回0,返回值表示实际读取的字节数,返回0,表示已到达文件末尾或者无可读取数据。文件读写指针会随读取到的字节数移动。
write函数 函数原型: size_t write(int fd, const char *buf, size_t count); 将buf缓存中的count个字节数据写入到fd所指向的文件中文件读写指针会随着移动,成功write函数会返回写入的字节数,有错误发生返回-1,将错误代码存入errno 中。三、 文件读写指针的移动 lseek用来移动文件读写指针的位置 size_t lseek(int fildes, off_t, offset, int whence); 参数fildes为已打开文件的文件描述符,参数offset为根据参数whence来移动读写位置的位移数。whence有以下三种取值: SEEK_SET 从文件开始处计算偏移量,文件指针到文件开始的距离为offset SEEK_CUR 从文件指针的当前位置计算偏移量,文件指针值等于当前指针值加上offset的值,offset允许取负值 SEEK_END 从文件结尾处计算偏移量, 文件指针值等于当前指针值加上offset值, offset允许取负值 调用成功返回当前的读写位置,也就是距离文件开始处有多少个字节,错误返回-1。
lseek的几种用法: lseek(int fildes, 0, SEEK_SET) 将文件读写指针移动到文件开头 lseek(int fildes, 0, SEEK_END) 将文件读写指针移动到文件末尾 lseek(int fildes, 0, SEEK_CUR) 将文件读写指针移动到当前位置