当前位置: 首页 > article >正文

标准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;
}
原文地址:https://blog.csdn.net/weixin_46829095/article/details/129639506
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/3065.html

相关文章:

  • 用Pytorch搭建一个房价预测模型
  • 关于学习的一些网站(自用)
  • 【C++】内联函数inline
  • 数据结构与算法——堆的基本存储
  • 电路设计的一些概念
  • 华为OD机试题,用 Java 解【卡片组成的最大数字】问题 | 含解题说明
  • 8个你一看就觉得很棒的Vue开发技巧
  • Liunx下的进程程序替换
  • GitHub Actions工作流搭建
  • jmeter 响应时间rt很小,但是tps也很小jmeter,脚本处理,千万不要用js
  • SpringBoot实战(十三)集成 Admin
  • 技术分享——Java8新特性
  • C语言——字符函数和字符串函数【详解】(一)
  • 如何才能做好Android 性能优化?
  • 基于Linux内核的驱动开发
  • Vue趣味【Vue3+Element Plus+Canvas实现一个简易画板;支持导出为图片】
  • new动态内库管理库学习
  • 【统计学习】25个必须掌握的数据分析基础概念
  • C# 委托
  • 【ARCore】Android ARCore 简介 ( AR 增强现实技术简介 | Android 平台常用的 AR 技术 | ARCore 相关资料收集 )