C语言实战之文件复制
liuian 2025-05-15 19:08 11 浏览
在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;
}
代码说明
- FILE *sourceFile, *targetFile;
定义两个文件指针,分别用于操作源文件和目标文件。 - fopen(sourceFilename, "r");
以只读模式打开源文件。 - fopen(targetFilename, "w");
以写入模式打开目标文件。如果目标文件不存在,则会创建它;如果目标文件已存在,则会清空其内容。 - fgetc(sourceFile)
从源文件中逐个字符读取内容。 - fputc(ch, targetFile)
将读取的字符写入目标文件。 - fclose(sourceFile) 和 fclose(targetFile)
关闭文件,释放资源。
编译和运行
- 将代码保存为 copy_file.c。
- 使用以下命令编译:
gcc copy_file.c -o copy_file
- 运行程序:
./copy_file
- 输入源文件名和目标文件名,程序会将源文件的内容复制到目标文件。
示例
假设有一个文本文件 source.txt,内容如下:
Hello, World!
This is a test file.
Welcome to C programming.
运行程序后,输入:
请输入源文件名: source.txt
请输入目标文件名: target.txt
程序会创建一个新文件 target.txt,内容与 source.txt 相同。
注意事项
- 文件路径
如果文件不在当前目录下,需要提供文件的完整路径。 - 文件大小
该程序逐字符复制文件,适合处理较小的文件。如果需要处理大文件,可以考虑使用缓冲区(如 fread 和 fwrite)来提高效率。 - 错误处理
如果源文件无法打开或目标文件无法创建,程序会输出错误信息并退出。
扩展:使用缓冲区复制文件
为了提高复制大文件的效率,可以使用缓冲区来一次性读取和写入多个字节。以下是修改后的代码:
#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;
}
改进点:
- fopen(..., "rb") 和 fopen(..., "wb")
以二进制模式打开文件,适用于所有类型的文件(包括文本文件和二进制文件)。 - fread 和 fwrite
使用缓冲区一次性读取和写入多个字节,提高效率。 - BUFFER_SIZE
定义了缓冲区的大小(例如 1024 字节),可以根据需要调整。
这个版本适合复制大文件,效率更高。
相关推荐
- 那些Java架构师必知必会的技术
-
Java基础#Java对象的内存布局MapStruct解了对象映射的毒周末我把HashMap源码又过了一遍Java7和Java8中的ConcurrentHashMap原理解析Java中自定...
- Java内存泄漏最全详解(6大原因及解决方案)
-
大家好,我是mikechen。内存泄漏是经常出现的线上故障,也是大厂面试经常考察的,下面我就全面来详解内存泄漏以及解决方案@mikechen本篇已收于mikechen原创超30万字《阿里架构师进阶专题...
- 都说Feign是RPC,没有侵入性,为什么我的代码越来越像 C++
-
1.概览随着SpringCloud的流行性,Feign已经成为RPC的事实标准,由于其构建与Http协议之上,对请求和返回值缺少规范约束,在日常开发过程中经常由于设计不当对系统造成一...
- 面试题系列-java后端面试题List 和 Set 的区别
-
List和Set的区别List,Set都是继承自Collection接口List特点:元素有放入顺序,元素可重复,Set特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉,(...
- 一直不理解为什么在重写equals方法时都要重写hashCode方法
-
为什么在重写equals方法时都要重写hashCode方法呢?首先jdk的要求是这样的,equals与hashcode间的关系:1、如果两个对象相同(即用equals比较返回true),那么它们的ha...
- 翻了ConcurrentHashMap1.7 和1.8的源码,我总结了它们的主要区别
-
ConcurrentHashMap思考:HashTable是线程安全的,为什么不推荐使用?HashTable是一个线程安全的类,它使用synchronized来锁住整张Hash表来实现线程安全,即每次...
- 10 个经典的 Java 集合面试题,看你能否答得上来?
-
来自:evget.com/article/2014/11/27/21869.html这里有10个经典的Java面试题,也为大家列出了答案。这是Java开发人员面试经常容易遇到的问题,相信你了解和掌握之...
- MyBatis3.5.11-从入门到高阶
-
一.课程介绍MyBatis概述MyBatis基础应用MyBatis高级MyBatis进阶二.MyBatis概述1、为什么需要MyBatis在我们程序中,运行时期产生的数据都是存放在内存中的,那么在内存...
- 灵魂拷问:如何检查 Java 数组中是否包含某个值?
-
作者|沉默王二责编|Elle在逛programcreek的时候,我发现了一些专注细节但价值连城的主题。比如说:如何检查Java数组中是否包含某个值?像这类灵魂拷问的主题,非常值得深入地研...
- Java后端学习路线是什么?
-
关于Java后端(SpringBoot为主)学习路线:一、Java基础阶段编程语言基础掌握基本数据类型(如int、double、char等)、变量、常量的定义和使用。理解运算符(算术、关...
- Mybatis配置文件XML全貌详解,再不懂我也没招了
-
一、为什么要使用配置文件试想,如果没有配置文件,我们的应用程序将只能沿着固定的姿态运行,几乎不能做任何动态的调整,那么这不是一套完美的设计,因为我们希望拥有更宽更灵活的操作空间和更多的兼容度,同时也能...
- 软件性能调优全攻略:从瓶颈定位到工具应用
-
性能调优是软件测试中的重要环节,旨在提高系统的响应时间、吞吐量、并发能力、资源利用率,并降低系统崩溃或卡顿的风险。通常,性能调优涉及发现性能瓶颈、分析问题根因、优化代码和系统配置等步骤,调优之前需要先...
- 你还在使用Guava的Lists.newArrayList()吗
-
Guava说起Guava,做Java开发的应该没人不知道吧,毕竟“google出品,必属精品”。虽然应该没有Spring那样让Javaer无法避开,但是其中很多工具类的封装还是让人欲罢不能。而我们今天...
- JDK成长记7:3张图搞懂HashMap底层原理
-
HashMap基本原理和优缺点HashMap基本原理和优缺点一句话讲,HashMap底层数据结构,JDK1.7数组+单向链表、JDK1.8数组+单向链表+红黑树。HashMap的3个底层原理Hash...
- 如何深度理解mybatis?
-
深度自定义mybatis回顾mybatis的操作的核心步骤编写核心类SqlSessionFacotryBuild进行解析配置文件深度分析解析SqlSessionFacotryBuild干的核心工作编写...
- 一周热门
-
-
Python实现人事自动打卡,再也不会被批评
-
Psutil + Flask + Pyecharts + Bootstrap 开发动态可视化系统监控
-
【验证码逆向专栏】vaptcha 手势验证码逆向分析
-
一个解决支持HTML/CSS/JS网页转PDF(高质量)的终极解决方案
-
再见Swagger UI 国人开源了一款超好用的 API 文档生成框架,真香
-
网页转成pdf文件的经验分享 网页转成pdf文件的经验分享怎么弄
-
C++ std::vector 简介
-
python使用fitz模块提取pdf中的图片
-
《人人译客》如何规划你的移动电商网站(2)
-
Jupyterhub安装教程 jupyter怎么安装包
-
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- table.render (33)
- uniapp textarea (33)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)