文件I/O

目录

代码编写

验证

代码如下


        下面编写一个文件内容复制的程序,对read、write、open、close、lseek、fprintf、strerror、exit函数的综合使用

代码编写

        第10行,定义一个全局的常量,可以在整个程序中使用,而且可以减少代码中的硬编码,方便维护和修改。如果在函数内定义变量是局部变量,只能在函数内使用,函数结束后就会被销毁,不能在其他函数中使用。而且每次调用函数时都会分配一次内存,会增加开销,降低程序性能。

        第16行,off_t 是 C 标准库定义的一个整数类型,通常用于文件偏移量的表示,它的定义可能因操作系统而异

        第18-22行,判断命令行传参是否等于三个,不等于就进入if语句控制块,等于往下继续执行。fprintf函数将格式化后的字符串输出到指定的文件流中,而stderr是C语言标准库中的一个预定义文件流,代表标准错误输出流,最后将格式化后的字符串输出到标准错误输出流中,显示给用户在终端上

        第24-34行,分别打开源文件argv[1]和需要复制的文件argv[2],前者用只读方式打开,后者用只写方式打开,如果在没有传入的文件就会创建该文件,并给予文件所有者读写的权限

         第37行,利用lseek函数从文件内容头偏移到文件内容尾,并返回偏移量,这样就计算出文件有多少个字符,就赋值给file_size变量

        第38行,因为此时光标经过偏移已经在文件内容尾,此时读文件将无法读取到字节数,所以要把文件光标重新拉回文件内容头再打开文件读取

        第40-48行,通过while循环不断读取文件,用read函数读取源文件在buf里面,然后就会返回读取到的字节数,然后把字节数赋值给bytes_read变量,再判断该变量是否大于0,如果大于0,说明有读取到文件新的内容,就进入while语句控制块;42行,把读取在buf中的内容写入到argv[2]的文件中,写入的数量就是读取到的字节数bytes_read变量,写入成功就会返回写入字节数,失败就会返回-1,把其赋值给bytes_written变量;43-47行判断是否写入成功;48行,把读取到的字节数累积,以此来记录目前已经读取的数据的总大小,这样下一次再使用该程序时候在计算偏移量时候使用它来确保每次读取数据的时候从上次结束的位置继续读取,避免重复读取已经读取的数据。单次使用这句话可有可无

        50-54行判断读取文件是否失败

        56-58行分别关闭文件,退出程序

验证

创建一个文件,名字随意,内容随意,这里如下,文件名字为1.txt

 运行程序

首先查看这里并没有2.txt文件,把2.txt文件作为传参,运行成功就创建了该文件

查看该文件就发现与1.txt文件内容一模一样

代码如下

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>

#define BUF_SIZE 1024

int main(int argc, char **argv)
{
    int cp_form_fd , cp_to_fd,bytes_read , bytes_written;
    char buf[BUF_SIZE];
    off_t file_size,offset=0;
    /*判断传参*/
    if(argc != 3)
    {
        fprintf(stderr, "Usage:%s fromfile tofile\n", argv[0]);
        exit(-1);
    }

    if((cp_form_fd = open(argv[1], O_RDONLY)) == -1 )
    {
        fprintf(stderr,"open %s error:%s\n",argv[1],strerror(errno));
        exit(-1);
    }
    /*允许文件所属者读写文件*/
    if((cp_to_fd = open(argv[2],O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR)) ==-1)
    {
        fprintf(stderr,"open %s error:%s\n",argv[2],strerror(errno));
        exit(-1);
    }

    /*获取源文件大小*/
    file_size = lseek(cp_form_fd,0,SEEK_END);
    lseek(cp_form_fd,0,SEEK_SET);

    while((bytes_read = read(cp_form_fd,buf,BUF_SIZE))>0)
    {    
        bytes_written = write(cp_to_fd,buf,bytes_read);
            if((bytes_written == -1))
            {
                fprintf(stderr,"write data failed:%s\n",strerror(errno));
                exit(-1);
            }    
        offset += bytes_read;
    }
        if(bytes_read == -1)
        {
            fprintf(stderr,"read data failed:%s\n",strerror(errno));
            exit(-1);
        }

    close(cp_form_fd);
    close(cp_to_fd);
    exit(0);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值