linux系统调用方式文件编程
定义/功能:文件描述符
在Linux系统中,所有打开的文件对应一个数字,这个数字由系统分配,称之为:文件描述符。(可类似理解为:省份证号与你本人的关系),通过文件描述符便可以对文件进行操作。
- 打开文件
1.1 函数名(功能+UNIX环境高级编程手册)
open
1.2 函数原形(终端man命令:man 2 open)
int open(const char *pathname, int flgs );
int open(const char *pathname, int flgs, mode_t mode );
1.3 函数功能
打开或创建一个文件
1.4 所属头文件
#include <sys/type.h>
#include <sys/stat.h>
#include <fcntl.h>
1.5 返回值
成功:返回文件描述符;失败:-1
1.6 参数说明
pathname:包含路径的文件
flags:
1. O_RDONIY ——
2. O_WRONIY ——
3. O_RDWR ——
a. O_APPEND ——以追加的方式打开文件:不删除文件里原有数据
b. O_CREAT ——当打开文件不存在时,创建该文件
mode:打开文件的读写权限设置(通过man命令获得)。以打开方式创建文件时,必须加上,否则可不定义
2. 创建文件
2.1 函数名(功能+UNIX环境高级编程手册)
creat
2.2 函数原形(终端man命令:man 3 gmtime)
Int creat(const char *pathname, mode_t mode);
2.3 函数功能
创建文件,以只写的方式打开文件
2.4 所属#include
#include <unistd.h>
5.5 返回值
成功:0
失败:-1
5.6 参数说明
fd:待关闭文件的文件描述符
4. 读取文件
4.1 函数名(功能+UNIX环境高级编程手册)
read
4.2 函数原形(终端man命令:man read)
size_t read(int fd, void *buf, size_t count);
4.3 函数功能
从一个打开的文件读取数据
4.4 所属头文件
#include <unistd.h>
1.5 返回值
成功:读取数据的字节数
失败:-1
4.6 参数说明
fd:要读取文件的描述符
buf:读取来的数据存在buf指向的空间
count:希望读取的字节数
- 写文件
5.1 函数名(功能+UNIX环境高级编程手册)
write
5.2 函数原形(终端man命令:man write)
size_t write(int fd, void *buf, size_t count);
5.3 函数功能
向一个打开的文件写入数据
5.4 所属头文件
#include <unistd.h>
5.5 返回值
成功:写入文件的字节数
失败:-1
5.6 参数说明
fd:要写入文件的描述符
buf:要写入文件的数据
count:要写入数据的字节数
- 定位文件
6.1 函数名(功能+UNIX环境高级编程手册)
lseek
6.2 函数原形(终端man命令:man lseek)
off_t lseek(int fd, off_t offset, int vhence);
6.3 函数功能
重新定位文件读写位置
6.4 所属头文件
#include <sys/types.h>
#include <unistd.h>
6.5 返回值
成功:移动后的文件指针距离文件头的字节数(位置)
失败:-1
6.6 参数说明
fd:要写入文件的描述符
offset:要移动的偏移量
whence:移动的初始位置
SEEK_SET:文件头
SEEK_CUT:当前位置
SEEK_END:文件尾
7. 复制文件描述符
7.1 函数名(功能+UNIX环境高级编程手册)
dup
7.2 函数原形(终端man命令:man write)
int dup(int oldfd) ;
7.3 函数功能
复制一个文件描述符
7.4 所属头文件
#include <unistd.h>
7.5 返回值
成功:返回新的文件描述符
失败:-1
7.6 参数说明
oldfd:要复制文件的描述符
示例:将一个文件的数据复制到另一个文件里
流程:
1. 打开源文件
2. 打开目标文件
3. 读取源文件数据写入目标文件
代码:
#include <sys/type.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
void main(int argc, char **argv[])
{
int fds;
int fdt;
char buf[512];
size_t count=0;
/*open source file*/
fds = open(argv[1],O_EDONLY);
/*open target file*/
fdt = open(arg[2],O_RDONLY|O_CREAT,0666);
/*read source data and write to target file*/
while((count = read(fds,buf,512)>0)
write(fdt,buf,count);
close(fds);
close(fdt);
}
综合实例代码:
#include <stdio.h>
#include <sys/type.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main()
{
int fdo;
int fdc;
char rbuf1[20];
char rbuf2[20];
char wbuf1[10] = "0123456789";
char wbuf2[10] = "9876543210";
size_t count1 = 0;
size_t count2 = 0;
/*open file*/
fdo = open("/home/open.c",RDWR);
//fdo = open("/home/open.c",RDWR|O_CREAT,0666);
if(fdo<0) printf("open file is failure!\n");
/*creat file*/
fdc = creat("/home/creat.c",0621);
if(fdc<0)printf("creat file is failure!\n");
/*write data to file*/
count1 = strlen(wbuf1);
count2 = strlen(wbuf2);
write(fdo,wbuf1,count1);
write(fdc,wbuf2,count2);
/*positioning file pointer */
lseek(fdo,0,SEEK_SET);
//lseek(fdc,0,SEEK_SET);
/*read data from file*/
read(fdo,rbuf1,10);
rbuf1 = '\0';
printf("rbuf1 is %s\n",rbuf1);
read(fdc,rbuf2,10);
rbuf2 = '\0';
printf("rbuf2 is %s\n",rbuf2);
close(fdo);
close(fdc);
}