LS8-linux系统调用方式文件编程之学习笔记

来源:互联网 发布:plc编程招聘东莞 编辑:程序博客网 时间:2024/05/22 14:09

linux系统调用方式文件编程
定义/功能:文件描述符
在Linux系统中,所有打开的文件对应一个数字,这个数字由系统分配,称之为:文件描述符。(可类似理解为:省份证号与你本人的关系),通过文件描述符便可以对文件进行操作。

  1. 打开文件
    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:希望读取的字节数

  1. 写文件
    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:要写入数据的字节数

  1. 定位文件
    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);} 
原创粉丝点击