百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

C语言实战之文件复制

liuian 2025-05-15 19:08 17 浏览

在C语言中,复制文件可以通过读取源文件的内容并将其写入目标文件来实现。以下是一个简单的示例程序,演示如何复制文件。

示例代码

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

int main() {
    FILE *sourceFile, *targetFile;
    char sourceFilename[100], targetFilename[100];
    char ch;

    // 提示用户输入源文件名
    printf("请输入源文件名: ");
    scanf("%s", sourceFilename);

    // 提示用户输入目标文件名
    printf("请输入目标文件名: ");
    scanf("%s", targetFilename);

    // 打开源文件
    sourceFile = fopen(sourceFilename, "r");
    if (sourceFile == NULL) {
        perror("无法打开源文件");
        return EXIT_FAILURE;
    }

    // 打开目标文件
    targetFile = fopen(targetFilename, "w");
    if (targetFile == NULL) {
        perror("无法创建目标文件");
        fclose(sourceFile); // 关闭源文件
        return EXIT_FAILURE;
    }

    // 复制文件内容
    while ((ch = fgetc(sourceFile)) != EOF) {
        fputc(ch, targetFile);
    }

    // 关闭文件
    fclose(sourceFile);
    fclose(targetFile);

    printf("文件复制成功!\n");

    return 0;
}

代码说明

  1. FILE *sourceFile, *targetFile;
    定义两个文件指针,分别用于操作源文件和目标文件。
  2. fopen(sourceFilename, "r");
    以只读模式打开源文件。
  3. fopen(targetFilename, "w");
    以写入模式打开目标文件。如果目标文件不存在,则会创建它;如果目标文件已存在,则会清空其内容。
  4. fgetc(sourceFile)
    从源文件中逐个字符读取内容。
  5. fputc(ch, targetFile)
    将读取的字符写入目标文件。
  6. fclose(sourceFile) 和 fclose(targetFile)
    关闭文件,释放资源。

编译和运行

  1. 将代码保存为 copy_file.c。
  2. 使用以下命令编译:
gcc copy_file.c -o copy_file
  1. 运行程序:
./copy_file
  1. 输入源文件名和目标文件名,程序会将源文件的内容复制到目标文件。

示例

假设有一个文本文件 source.txt,内容如下:

Hello, World!
This is a test file.
Welcome to C programming.

运行程序后,输入:

请输入源文件名: source.txt
请输入目标文件名: target.txt

程序会创建一个新文件 target.txt,内容与 source.txt 相同。


注意事项

  1. 文件路径
    如果文件不在当前目录下,需要提供文件的完整路径。
  2. 文件大小
    该程序逐字符复制文件,适合处理较小的文件。如果需要处理大文件,可以考虑使用缓冲区(如 fread 和 fwrite)来提高效率。
  3. 错误处理
    如果源文件无法打开或目标文件无法创建,程序会输出错误信息并退出。

扩展:使用缓冲区复制文件

为了提高复制大文件的效率,可以使用缓冲区来一次性读取和写入多个字节。以下是修改后的代码:

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

#define BUFFER_SIZE 1024

int main() {
    FILE *sourceFile, *targetFile;
    char sourceFilename[100], targetFilename[100];
    char buffer[BUFFER_SIZE];
    size_t bytesRead;

    // 提示用户输入源文件名
    printf("请输入源文件名: ");
    scanf("%s", sourceFilename);

    // 提示用户输入目标文件名
    printf("请输入目标文件名: ");
    scanf("%s", targetFilename);

    // 打开源文件
    sourceFile = fopen(sourceFilename, "rb");
    if (sourceFile == NULL) {
        perror("无法打开源文件");
        return EXIT_FAILURE;
    }

    // 打开目标文件
    targetFile = fopen(targetFilename, "wb");
    if (targetFile == NULL) {
        perror("无法创建目标文件");
        fclose(sourceFile); // 关闭源文件
        return EXIT_FAILURE;
    }

    // 使用缓冲区复制文件内容
    while ((bytesRead = fread(buffer, 1, BUFFER_SIZE, sourceFile)) > 0) {
        fwrite(buffer, 1, bytesRead, targetFile);
    }

    // 关闭文件
    fclose(sourceFile);
    fclose(targetFile);

    printf("文件复制成功!\n");

    return 0;
}

改进点:

  1. fopen(..., "rb") 和 fopen(..., "wb")
    以二进制模式打开文件,适用于所有类型的文件(包括文本文件和二进制文件)。
  2. fread 和 fwrite
    使用缓冲区一次性读取和写入多个字节,提高效率。
  3. BUFFER_SIZE
    定义了缓冲区的大小(例如 1024 字节),可以根据需要调整。

这个版本适合复制大文件,效率更高。

相关推荐

Optional是个好东西,如果用错了就太可惜了

原文出处:https://xie.infoq.cn/article/e3d1f0f4f095397c44812a5be我们都知道,在Java8新增了一个类-Optional,主要是用来解决程...

IDEA建议:不要在字段上使用@Autowire了!

在使用IDEA写Spring相关的项目的时候,在字段上使用@Autowired注解时,总是会有一个波浪线提示:Fieldinjectionisnotrecommended.纳尼?我天天用,咋...

Spring源码|Spring实例Bean的方法

Spring实例Bean的方法,在AbstractAutowireCapableBeanFactory中的protectedBeanWrappercreateBeanInstance(String...

Spring技巧:深入研究Java 14和SpringBoot

在本期文章中,我们将介绍Java14中的新特性及其在构建基于SpringBoot的应用程序中的应用。开始,我们需要使用Java的最新版本,也是最棒的版本,Java14,它现在还没有发布。预计将于2...

Java开发200+个学习知识路线-史上最全(框架篇)

1.Spring框架深入SpringIOC容器:BeanFactory与ApplicationContextBean生命周期:实例化、属性填充、初始化、销毁依赖注入方式:构造器注入、Setter注...

年末将至,Java 开发者必须了解的 15 个Java 顶级开源项目

专注于Java领域优质技术,欢迎关注作者:SnailClimbStar的数量统计于2019-12-29。1.JavaGuideGuide哥大三开始维护的,目前算是纯Java类型项目中Sta...

字节跨平台框架 Lynx 开源:一个 Web 开发者的原生体验

最近各大厂都在开源自己的跨平台框架,前脚腾讯刚宣布计划四月开源基于Kotlin的跨平台框架「Kuikly」,后脚字节跳动旧开源了他们的跨平台框架「Lynx」,如果说Kuikly是一个面向...

我要狠狠的反驳“公司禁止使用Lombok”的观点

经常在其它各个地方在说公司禁止使用Lombok,我一直不明白为什么不让用,今天看到一篇文章列举了一下“缺点”,这里我只想狠狠地反驳,看到列举的理由我竟无言以对。原文如下:下面,结合我自己使用Lomb...

SpringBoot Lombok使用详解:从入门到精通(注解最全)

一、Lombok概述与基础使用1.1Lombok是什么Lombok是一个Java库,它通过注解的方式自动生成Java代码(如getter、setter、toString等),从而减少样板代码的编写,...

Java 8之后的那些新特性(六):记录类 Record Class

Java是一门面向对象的语言,而对于面向对象的语言中,一个众所周知的概念就是,对象是包含属性与行为的。比如HR系统中都会有雇员的概念,那雇员会有姓名,ID身份,性别等,这些我们称之为属性;而雇员同时肯...

为什么大厂要求安卓开发者掌握Kotlin和Jetpack?优雅草卓伊凡

为什么大厂要求安卓开发者掌握Kotlin和Jetpack?深度解析现代Android开发生态优雅草卓伊凡一、Kotlin:Android开发的现代语言选择1.1Kotlin是什么?Kotlin是由...

Kotlin这5招太绝了!码农秒变优雅艺术家!

Kotlin因其简洁性、空安全性和与Java的无缝互操作性而备受喜爱。虽然许多开发者熟悉协程、扩展函数和数据类等特性,但还有一些鲜为人知的特性可以让你的代码从仅仅能用变得真正优雅且异常简洁。让我们来看...

自行部署一款免费高颜值的IT资产管理系统-咖啡壶chemex

在运维时,ICT资产太多怎么办,还是用excel表格来管理?效率太低,也不好多人使用。在几个IT资产管理系统中选择比较中,最终在Snipe-IT和chemex间选择了chemex咖啡壶。Snip...

PHP对接百度语音识别技术(php对接百度语音识别技术实验报告)

引言在目前的各种应用场景中,语音识别技术已经越来越常用,并且其应用场景正在不断扩大。百度提供的语音识别服务允许用户通过简单的接口调用,将语音内容转换为文本。本文将通过PHP语言集成百度的语音识别服务,...

知识付费系统功能全解析(知识付费项目怎么样)

开发知识付费系统需包含核心功能模块,确保内容变现、用户体验及运营管理需求。以下是完整功能架构:一、用户端功能注册登录:手机号/邮箱注册,第三方登录(微信、QQ)内容浏览:分类展示课程、文章、音频等付费...