一、文件I/O操作

本文详细介绍了UNIX系统中五个关键的文件I/O函数:open、close、lseek、read和write。通过实例展示了如何使用这些函数进行文件拷贝,深入理解文件描述符、文件偏移量及文件读写操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:

UNIX系统中绝大多数文件I/O会用到五个函数,分别是open、read、write、lseek、close。

函数操作:

1、open函数

头文件:#include<fcntl.h>

函数原型:int open(const char *path, int oflag,........)

参数说明: path:一般指需要打开或者创建的文件名字

                   oflag:常用的标志(O_RDONLY、O_WRONLY、O_RDWR、O_CRAET、O_TRUNC)

2、close函数

头文件:#include<unistd.h>

函数原型:int close(int fd)

参数说明:fd:需要关闭的文件描述符

3、lseek函数

头文件:#include<unistd.h>

函数原型:off_t  lseek(int fd, off_t offset, int whence)

参数说明:fd: 需要操作文件的文件描述符

                 offset:与whence有关具体如下:

                            whence = SEEK_SET    文件的偏移量设置位距文件的开始处的offset个字节     

                            whence = SEEK_CUR  文件的偏移量设置为当前值加上offset个字节 

                           whence  = SEEK_END   将文件的偏移量设置成文件长度加上offset个字节

返回值:返回新的文件偏移量

4、read函数

头文件:#include<unistd.h>

函数原型:ssize_t read(int fd, void *buf, size_t nbytes )

参数说明:fd: 需要读取文件的文件描述符

                  buf:读取的数据存入buf中

                 nbytes:需要读取的字节数

5、write函数

头文件:#include<unsitd.h>

函数原型:ssize_t write(int fd, void *buf, size_t nbytes)

参数说明:fd: 需要写入文件的文件描述符

                  buf:存储需要写数据的buf

                 nbytes:需要写入文件的字节数

函数的综合用法:拷贝文件

#include<stdio.h>

#include <fcntl.h>
#include <unistd.h>

//c 语言入口
int main(int argc, char ** argv)
{
    if(argc != 3) {
        fprintf(stderr, "Usage: %s src_file des_file\n", argv[0]);
        return -1;
    }

    int fdr;      //读文件描述符号;
    int fdw;    //写文件描述符号;
    fdr = open(argv[1], O_RDONLY);    //以只读的方式打开
    if(-1 == fdr)  {
        perror("open");
        return  -1;
    }

    fdw = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0644);  //只写的方式打开,如果没有文件就创建
    if(-1 == fdw)  {
        perror("open");
        close(fdr);
    }

    int ret;
    char buf[1024 * 1024] ;

    memset(buf, 0, 1024*1024);
    while(1) {
        ret = read(fdr, buf, 1024 * 1024);
        if(-1 == ret) {
            perror("read");
            close(fdr);
        }
        if(0 == ret)
            break;
    
        ret = write(fdw, buf, ret);
        if(-1 == ret)  {
            perror("write");                                                                                                                                                                                    close(fdw);
        }
    }

    close(fdr);
    close(fdw);
    return 0;
}
 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值