系统调用方式文件编程,王明学learn
系统调用方式文件编程
一、文件描述符
在Linux系统中,所有打开的文件也对应一个数字,这个数字由系统来分配,我们称之为:文件描述符。
二、函数学习
2.1打开文件 open
2.1.2 函数原形
1).int open(const char *pathname,int flags);
2).int open(const char *pathname,int flags,mode_t mode);
2.1.3 函数功能
打开或者创建一个文件
2.1.4 所属头文件
<sys/types.h> <sys/stat.h> <fcntl.h>
2.1.5 返回值
成功:文件文件描述符 失败:-1
2.1.6 参数说明
pathname:要打开的文件名(包含路径)
flags:文件打开的标志(参数含义如表格)
O_APPEND:已追加的方式打开文件
O_CREAT:如果要打开的文件不存在,创建该文件
mode:一定是在flags中使用了O_CREAT标志,mode记录待创建的文件访问权限(标志含义如下)
2.2 创建文件 creat
2.2.1 函数原形
int creat(const char *pathname,mode_t mode);
2.2.2 函数功能
创建一个文件并且以只写方式打开
2.2.3 所属头文件
<sys/types.h> <sys/stat.h> <fcntl.h>
2.2.4 返回值
成功:文件描述符 失败:-1
2.2.5 参数说明
Pathname:创建的文件名(含路径)
mode:创建的文件的读写权限
2.3读文件read
2.3.1 函数原形
ssize_t (int fd,void *buf,size_t count);
2.3.2函数功能
从一个打开的文件中读取数据
2.3.3 所属头文件
<unistd.h>
2.3.4 返回值
成功:返回读取的字节数
失败:-1
2.3.5 参数说明
fd:要读取数据的文件描述符
count:希望读取的字节数
buf:读取到的数据存放到buf指向的空间
2.4 写文件 write
2.4.1.函数原形
ssize_t write(int fd,void *buf,size_t count);
2.4.2 函数功能
向一个打开的文件写入数据
2.4.3所属头文件
<unistd.h>
2.4.4返回值
成功:返回写入到文件的字节数
失败:-1
2.4.5参数说明
fd:要写入的文件描述符
buf:从buf中取数据
count:要写入的字节数
2.5定位文件lseek
2.5.1函数原形
off_t lseek(int fd,off_t offset,int whence);
2.5.2函数功能
lseek()将文件读写指针相对 whence 移动 offset 个字节
2.5.3所属头文件
<unistd.h> <sys/types.h>
2.5.4返回值
成功:返回距离文件头的偏移量
失败:-1
2.5.5参数说明
fd:要调整的文件
offset:偏移的地址数目
offset 取负值,例如下述调用将文件指针相对当前位置向前移动 5 个字节。
lseek(fd, -5, SEEK_CUR);
由于 l seek 函数的返回值为文件指针相对于文件头的位置, 因此下列调用的返回值就是文件的长度:
lseek(fd, 0, SEEK_END);
whence:表示的是文件指针从什么地址移动
SEEK_SET:相对文件开头。
SEEK_CUR:相对文件读写指针的当前位置。
SEEK_END:相对文件末尾。
2.6复制文件描述符dup
2.6.1函数原形
int dup(int oldfd);
2.6.2 函数功能
复制一个文件描述符
2.6.3 所属头文件
<unistd.h>
2.6.4返回值
成功:返回新的文件描述符
失败:-1
2.6.5参数说明
oldfd:待复制的老文件描述符
实例:
1 #include <sys/types.h> 2 #include <sys/stat.h> 3 #include <fcntl.h> 4 #include <stdio.h> 5 #define LENGTH 100 6 main() 7 { 8 int fd, len; 9 char str[LENGTH]; 10 11 fd = open("hello.txt",O_CREAT |O_RDWR,S_IRUSR |S_IWUSR); /* 12 创建并打开文件 */ 13 if (fd) 14 { 15 write(fd, "Hello World", strlen("Hello World")); /*写入字符串 */ 16 17 close(fd); 18 } 19 20 fd = open("hello.txt",O_RDWR); 21 len = read(fd, str, LENGTH); /* 读取文件内容 */ 22 str[len] = '\0'; 23 printf("%s\n", str); 24 close(fd); 25 }