文件IO函数

1.  open(const char *pathname,int flags):

open(const char *pathname,int flags,mode_t mode):

功能:打开文件

参数:  pathname:文件的路径和名字

flags:打开的方式

O_RDONLY:只读

O_WRONLY:只写

O_RDWR:读写

O_CREAT:创建,一定要填写第三个参数 mode权限 0664

O_EXCL:一般跟O_CREAT连用,如果文件存在返回EEXIST

O_TRUNC:清空

O_APPEND:追加

mode:权限0664  mode &(~umask)(umask一般默认0002(八进制))

返回值:成功返回文件描述符,失败返回-1置位错误码

2.close(int fd):

功能:关闭文件

参数:  fd:文件描述符

返回值:成功返回0,失败返回-1置位错误码

3.read(int fd,void *buf,size_t count):

功能:从文件中读数据到buf中

参数:  fd:文件描述符

buf: 存数据的首地址

count:大小(字节)

返回值:成功返回读取字符的个数,如果返回的个数小于count不代表错误,如果读取到了0代表EOF,失败返回-1,置位错误码

4.write(int fd,const void *buf,size_t count):

功能:从buf中写数据到文件中

参数:  fd:文件描述符

buf: 取数据的首地址

count:大小(字节)

返回值:成功返回写入字符的个数,如果返回的个数小于count不代表错误表示写满了,失败返回-1,置位错误码

例:实现拷贝功能

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
int main(int argc, char const *argv[])
{
    if(argc!=3){
        fprintf(stderr,"intput error,try again\n");
        fprintf(stderr,"usage: ./a.out srcfile destfile\n");
        return -1;
    }
    int sfd,dfd;
    int ret=0;
    char buf[1024]={0};
    if((sfd=open(argv[1],O_RDONLY))==-1){
        perror("open srcfile error");
        return -1;
    }
    if((dfd=open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0664))==-1){
        perror("open destfile error");
        return -1;
    }
    while((ret=read(sfd,buf,sizeof(buf)))!=0){//0表示读到结尾
        write(dfd,buf,ret);
    }
    close(sfd);
    close(dfd);
    return 0;
}

5.lseek(int fd,off_t offset,int whence):

功能:设置光标的位置

参数:  fd:文件描述符

offset: 偏移

>0:向后偏移

=0:不偏移

<0:前偏移

whence:

SEEK_SET:开头

SEEK_CUR:当前位置

SEEK_END:结尾

返回值:成功返回光标到开头字符的个数(lseek=fseek+ftell),失败返回-1置位错误码

6.stat(const char *pathname,struct stat *statbuf):

功能:获取文件的属性信息

参数:  pathname:文件的路径及名字

statbuf:获取到的状态信息

返回值:成功返回0,失败返回-1并置位错误码

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>

int main(int argc, char const *argv[])
{
    if(argc!=2){
        fprintf(stderr,"intput error,try again\n");
        fprintf(stderr,"usage:./a.out filename\n");
        return -1;
    }
    struct stat st;
    if(stat(argv[1],&st)){
        perror("get file stat error");
        return -1;
    }
    if((st.st_mode &0170000)==0100000){
        printf("这是一个普通文件\n");
    }else if((st.st_mode &0170000)==0040000){
        printf("这是一个目录文件\n");
    }else if((st.st_mode &0170000)==0020000){
        printf("这是一个字符设备文件\n");
    }else if((st.st_mode &0170000)==0060000){
        printf("这是一个块设备文件\n");
    }else if((st.st_mode &0170000)==0010000){
        printf("这是一个管道文件\n");
    }else if((st.st_mode &0170000)==0120000){
        printf("这是一个链接文件\n");
    }else if((st.st_mode &0170000)==0140000){
        printf("这是一个套接字文件\n");
    }
    printf("inode_num=%ld\n",st.st_ino);//打印文件的inode号,类似于身份证是唯一的
    return 0;
}

7.dup(int oldfd):

功能:拷贝文件描述符,拷贝的文件描述符和旧的文件描述符共用offset(光标),但是不共用flags

参数: oldfd:旧的文件描述符

返回值:成功返回新的文件描述符,失败返回-1,置位错误码

8.dup2(int oldfd,int newfd):   服务器会经常用到这个函数

功能:将oldfd拷贝newfd,如果newfd已经有对应的打开的文件,将这个文件关闭,然后将旧的文件描述符拷贝成新的文件描述符

参数: oldfd:旧的文件描述符

newfd:新的文件描述符

返回值:成功返回新的文件描述符,失败返回-1,置位错误码

dup2(fd,0);    //将标准输入写到文件中

dup2(fd,1);    //将标准输出写到文件中

dup2(fd,2);    //将标准出错写到文件中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值