c++比较两个文件是否相同方法 c++如何实现文件内容对比

大枫酱_8892

大枫酱_8892

2026-03-21

390人浏览

原创

最稳妥的文件内容比对方式是逐块读取:先用std::filesystem::file_size(path, ec)校验大小,再以binary模式用std::ifstream分块读入栈数组或std::vector,每次通过gcount()获取实际字节数并用std::memcmp比较,注意清failbit、处理eof差异及windows二进制模式。

c++比较两个文件是否相同方法 c++如何实现文件内容对比

用 std::ifstream 逐块读取比对最稳妥

直接用 std::filesystem::equivalent() 只能判断是否指向同一文件(硬链接/软链接),不能判断内容是否相同;而全量读入内存再 std::equal 又可能崩掉大文件。逐块读取是平衡安全性和准确性的通用做法。

  • 每次读固定大小(如 8192 字节)到 std::vector<char></char> 或栈数组,用 std::memcmp 比较两块
  • 必须检查每次 read() 的实际字节数:两个流读到 EOF 的位置可能不同,不能只看 eof() 标志
  • 读取前要调用 clear() 清除可能存在的 failbit,否则后续读取会静默失败
  • 示例关键逻辑:
    std::ifstream f1("a.txt", std::ios::binary);<br>std::ifstream f2("b.txt", std::ios::binary);<br>char buf1[8192], buf2[8192];<br>while (f1.read(buf1, sizeof(buf1)) || f2.read(buf2, sizeof(buf2))) {<br>    size_t n1 = f1.gcount(), n2 = f2.gcount();<br>    if (n1 != n2 || std::memcmp(buf1, buf2, n1)) return false;<br>}

Windows 下注意 _O_BINARY 和 BOM 处理

在 Windows 上用 std::ifstream 默认以文本模式打开,会把 \r\n 自动转成 \n,导致二进制比对失败。必须显式指定 std::ios::binary。

C++ Code Review Master
C++ Code Review Master

组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。

下载
  • 即使加了 binary,UTF-8 BOM(0xEF 0xBB 0xBF)仍会被原样读入,属于文件内容一部分,无需跳过——除非业务明确要求“忽略 BOM 的语义等价”
  • 如果要用 C API(如 _open),记得传 _O_BINARY,否则 _read 会在 \x1A(Ctrl+Z)提前截断
  • 跨平台项目中,避免依赖 _setmode(_fileno(stdin), _O_BINARY) 这类 Windows 特有调用

std::filesystem::file_size() 必须先校验

文件大小不同,直接返回 false 是最快路径。但这个函数可能抛异常(权限不足、路径不存在、符号链接断裂),不能无保护调用。

  • 务必用 std::error_code 重载版本:std::filesystem::file_size(path, ec),避免异常打断流程
  • 即使大小相等,也不能跳过内容比对:空文件、稀疏文件、加密容器都可能出现“大小同但内容异”
  • 某些文件系统(如某些 NFS 或 FAT32)可能报告错误的大小,尤其是刚写完未 flush 的文件,所以大小一致只是必要非充分条件

别用 std::string 存整个文件做比较

用 std::string 读取大文件不仅慢,还容易触发多次内存重分配,甚至 OOM。更隐蔽的问题是:std::string 的 data() 不保证以 \0 结尾,而某些旧代码误用 c_str() 做 memcmp,会导致越界读。

  • 改用 std::vector<char></char>:构造时指定容量,resize() 后用 data() 安全
  • 若确定文件小于几 MB 且内存充足,可用 std::vector<char> buf(std::filesystem::file_size(p)); f.read(buf.data(), buf.size());</char>
  • 永远不要对 std::string 调用 reserve() 后就认为 data() 可写——它不提供可写保证,C++20 前尤其危险
实际写的时候,最容易被忽略的是读取末尾那一次:两个文件长度模块长余数不同,但只检查了 eof(),没核对 gcount(),结果短文件多读了一次零填充块,比对就错了。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

5839

3

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

5287

5

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.10

2328

6

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.26

3139

3

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.27

2698

6

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

2023.08.01

1468

3

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2479

5

windows无法访问共享电脑
windows无法访问共享电脑

在现代社会中,共享电脑是办公室和家庭的重要组成部分。然而,有时我们可能会遇到Windows无法访问共享电脑的问题。这个问题可能会导致数据无法共享,影响工作和生活的正常进行。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.08

3250

4

windows自动更新
windows自动更新

Windows操作系统的自动更新功能可以确保系统及时获取最新的补丁和安全更新,以提高系统的稳定性和安全性。然而,有时候我们可能希望暂时或永久地关闭Windows的自动更新功能。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

1557

3

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Conan 2 Essentials 免费课程
Conan 2 Essentials 免费课程

共0课时 | 0人学习

CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习

Conan 2 高级依赖模型介绍
Conan 2 高级依赖模型介绍

共0课时 | 0人学习