C++文件拷贝推荐用ifstream+ofstream二进制分块读写:以ios::binary打开源目标文件,用8KB vector缓冲区循环read/write,检查good()和gcount()确保正确性。
用 C++ 实现文件拷贝,核心是读取源文件内容、写入目标文件,关键在于正确处理二进制数据、避免文本模式换行符转换、合理管理缓冲区和资源。标准库 足够完成,无需第三方库。
这是最常用、可控性强、内存友好的方式。以二进制模式打开文件,用固定大小缓冲区(如 8KB)分批读写,兼顾效率与安全性。
std::ifstream 以 std::ios::binary 模式打开,检查是否成功std::ofstream 以 std::ios::binary | std::ios::out 模式打开,自动覆盖同名文件std::vector buffer(8192) 作为中转缓冲区in.read(buffer.data(), buffer.size()),再用 out.write() 写出实际读取字节数(in.gcount())in.good() 或 !in.eof(),确保读完且无错误适合小文件或追求代码简洁的场景,利用流迭代器把整个文件“当作序列”复制,底层仍走缓冲,但封装更高级。
std::ifstream in("src.bin", std::ios::binary); 和 std::ofstream out("dst.bin", std::ios::binary);
out —— 这行就完成了全部拷贝
in 和 out 的状态,例如 if (!in || !out) { /* 处理失败 */ }
真实项目中,光拷贝逻辑不够,还要适配不同系统路径分隔符、报告具体错误原因。
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 表示成功。不复杂但容易忽略细节。