0

0

如何用c++实现文件拷贝 功能类似复制粘贴【IO操作实战】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-01-09 13:22:02

|

623人浏览过

|

来源于php中文网

原创

C++文件拷贝推荐用ifstream+ofstream二进制分块读写:以ios::binary打开源目标文件,用8KB vector缓冲区循环read/write,检查good()和gcount()确保正确性。

如何用c++实现文件拷贝 功能类似复制粘贴【io操作实战】

用 C++ 实现文件拷贝,核心是读取源文件内容、写入目标文件,关键在于正确处理二进制数据、避免文本模式换行符转换、合理管理缓冲区和资源。标准库 足够完成,无需第三方库。

使用 ifstream + ofstream 逐块读写(推荐)

这是最常用、可控性强、内存友好的方式。以二进制模式打开文件,用固定大小缓冲区(如 8KB)分批读写,兼顾效率与安全性。

  • 源文件用 std::ifstreamstd::ios::binary 模式打开,检查是否成功
  • 目标文件用 std::ofstreamstd::ios::binary | std::ios::out 模式打开,自动覆盖同名文件
  • 定义 std::vector buffer(8192) 作为中转缓冲区
  • 循环调用 in.read(buffer.data(), buffer.size()),再用 out.write() 写出实际读取字节数(in.gcount()
  • 每次读取后检查 in.good()!in.eof(),确保读完且无错误

用 istreambuf_iterator 一行流式拷贝(简洁但需注意)

适合小文件或追求代码简洁的场景,利用流迭代器把整个文件“当作序列”复制,底层仍走缓冲,但封装更高级。

  • 声明 std::ifstream in("src.bin", std::ios::binary);std::ofstream out("dst.bin", std::ios::binary);
  • 直接写:out —— 这行就完成了全部拷贝
  • 优点是代码极简;缺点是无法控制缓冲大小,大文件可能临时占用较多内存(取决于实现),且错误反馈较弱
  • 务必检查 inout 的状态,例如 if (!in || !out) { /* 处理失败 */ }

跨平台路径与错误处理不能少

真实项目中,光拷贝逻辑不够,还要适配不同系统路径分隔符、报告具体错误原因。

立即学习C++免费学习笔记(深入)”;

Magic Write
Magic Write

Canva旗下AI文案生成器

下载
  • 路径建议用 std::filesystem::path(C++17 起),它自动处理 /\\
  • std::filesystem::copy_file() 可直接替代手写逻辑(支持覆盖、跳过等选项),但本题要求“IO操作实战”,所以手动实现更有价值
  • 错误处理别只靠 if (!in),可结合 in.rdstate() 判断是打开失败、读取失败还是 EOF;用 std::strerror(errno) 获取系统级错误信息(需包含
  • 拷贝完成后,建议调用 out.flush() 并检查 out.bad() 确保数据真正落盘

完整可运行示例(带基础错误提示)

以下是一个健壮、注释清晰的最小可行实现:

#include 
#include 
#include 
#include 
#include 

bool copyFile(const std::string& src, const std::string& dst) { std::ifstream in(src, std::ios::binary); if (!in) { std::cerr << "打开源文件失败: " << src << " (" << std::strerror(errno) << ")\n"; return false; }

std::ofstream out(dst, std::ios::binary);
if (!out) {
    std::cerr zuojiankuohaophpcnzuojiankuohaophpcn "创建目标文件失败: " zuojiankuohaophpcnzuojiankuohaophpcn dst zuojiankuohaophpcnzuojiankuohaophpcn " (" zuojiankuohaophpcnzuojiankuohaophpcn std::strerror(errno) zuojiankuohaophpcnzuojiankuohaophpcn ")\n";
    return false;
}

std::vectorzuojiankuohaophpcncharyoujiankuohaophpcn buf(8192);
while (in.read(buf.data(), buf.size())) {
    out.write(buf.data(), buf.size());
}
// 处理剩余不足一整块的数据
if (in.gcount() youjiankuohaophpcn 0) {
    out.write(buf.data(), in.gcount());
}

if (!out) {
    std::cerr zuojiankuohaophpcnzuojiankuohaophpcn "写入目标文件失败: " zuojiankuohaophpcnzuojiankuohaophpcn dst zuojiankuohaophpcnzuojiankuohaophpcn "\n";
    return false;
}
return true;

}

调用时传入两个字符串路径即可,返回 true 表示成功。不复杂但容易忽略细节。

相关专题

更多
高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

43

2026.01.16

全民K歌得高分教程大全
全民K歌得高分教程大全

本专题整合了全民K歌得高分技巧汇总,阅读专题下面的文章了解更多详细内容。

84

2026.01.16

C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

24

2026.01.16

java数据库连接教程大全
java数据库连接教程大全

本专题整合了java数据库连接相关教程,阅读专题下面的文章了解更多详细内容。

35

2026.01.15

Java音频处理教程汇总
Java音频处理教程汇总

本专题整合了java音频处理教程大全,阅读专题下面的文章了解更多详细内容。

16

2026.01.15

windows查看wifi密码教程大全
windows查看wifi密码教程大全

本专题整合了windows查看wifi密码教程大全,阅读专题下面的文章了解更多详细内容。

56

2026.01.15

浏览器缓存清理方法汇总
浏览器缓存清理方法汇总

本专题整合了浏览器缓存清理教程汇总,阅读专题下面的文章了解更多详细内容。

16

2026.01.15

ps图片相关教程汇总
ps图片相关教程汇总

本专题整合了ps图片设置相关教程合集,阅读专题下面的文章了解更多详细内容。

9

2026.01.15

ppt一键生成相关合集
ppt一键生成相关合集

本专题整合了ppt一键生成相关教程汇总,阅读专题下面的的文章了解更多详细内容。

26

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 3.9万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号