标准I/O

目录

区别

代码编写

验证

代码如下


        利用fopen/fwrite/fclose/fprintf函数实现文件内容复制

区别

        下面编写内容没有使用fseek函数,因为freadfwrite都会自动跟踪读写位置。 fread从源文件读取数据并将文件指针后移,fwrite将读取的数据写入目标文件并将目标文件指针后移。这样,每次读取和写入都会在正确的位置进行,无需使用fseek来手动定位文件指针;

        read和write函数时,它们并不会自动跟踪读写位置。每次调用read或write都会从文件或设备中读取或写入指定的字节数,而不考虑之前的读写位置。如果需要实现随机读写,需要结合lseek函数使用

代码编写

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

        12-16行,判断命令行传参是否相等

         18-27行,用只读打开源文件,用创建和追加的方式打开目标文件,如果目标文件不存在就创建,如果目标文件存在就在该文件中的文件内容尾进行内容追加,fprintf函数将格式化后的字符串输出到指定的文件流中,而stderr是C语言标准库中的一个预定义文件流,代表标准错误输出流,最后将格式化后的字符串输出到标准错误输出流中,显示给用户在终端上

 

         29行,从源文件中读取BUFFER_SIZE字节的数据,每次读取1字节,读取的数据存放在buffer缓冲区中,并返回实际读取的数据块数量

        31行,buffer 指向的是源文件中读取到的数据块,也就是要写入到目标文件中的数据。bytes_read 是指实际读取到的数据块字节数,它可能小于 BUFFER_SIZE,所以这里使用 bytes_read 作为第三个参数,以确保只写入实际读取到的数据块。第二个参数 1 表示每个数据块的字节数为 1

        32-36行,如果写入的数量比读取的数量少说明出错了,就打印提示

        40-45行,分别关闭文件,打印写入,退出

验证

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

 

 运行文件

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

查看该文件就发现与word.c文件内容一模一样

代码如下

#include<stdio.h>
#include<stdlib.h>

#define BUFFER_SIZE 1024

int main(int argc, char **argv)
{
    FILE *source_file_fp , *target_file_fp;
    char buffer[BUFFER_SIZE];
    size_t bytes_read , bytes_written;
    /*判断传入参数*/
    if(argc != 3)
    {
        fprintf(stderr, "Usage: %s source_file_fp target_file_fp\n", argv[0]);
        exit(EXIT_FAILURE);
    }
    /*打开文件*/
    if((source_file_fp = fopen(argv[1],"r")) == NULL)
    {
        fprintf(stderr, "Error: cannot open source file '%s'\n", argv[1]);
        exit(EXIT_FAILURE);
    }
    if((target_file_fp = fopen(argv[2],"a")) == NULL)
    {
        fprintf(stderr, "Error: cannot open target file '%s'\n", argv[2]);
        exit(EXIT_FAILURE);
    }
    
    while((bytes_read = fread(buffer,1,BUFFER_SIZE,source_file_fp)) > 0)/*获取读取量*/
    {
        bytes_written = fwrite(buffer,1,bytes_read,target_file_fp);/*获取写入量*/
        if(bytes_written < bytes_read)
        {
            fprintf(stderr, "Error: cannot write to target file '%s'\n", argv[2]);
            exit(EXIT_FAILURE);
        }
    }

    fclose(source_file_fp);
    fclose(target_file_fp);
    
    printf("File '%s' has been successfully copied to '%s'\n", argv[1], argv[2]);
    
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值