必须以二进制模式打开文件并用std::streamoff存储tellg结果,seekg前需clear(),最后一块须单独计算剩余字节数,读取后检查gcount()而非eof()。

用 seekg 和 tellg 切大文件前,先确认流是否支持随机访问
不是所有 C++ 文件流都能靠 seekg 精确定位 —— 只有以 std::ios::binary 模式打开的文件才保证 tellg 返回字节偏移、seekg 能跳转到任意位置。文本模式下换行符处理会干扰偏移计算,导致切割错位。
- 必须用
std::ifstream file(path, std::ios::binary)打开,否则tellg值不可信 - 打开后立即调用
file.seekg(0, std::ios::end)再file.tellg()获取总大小,避免因缓冲区未刷新而读小 - Windows 下若用默认文本模式打开二进制文件,
\r\n可能被当作一个字符处理,tellg返回值比实际字节数小
按字节均分时,tellg 的返回值必须是 std::streamoff,别用 int 或 size_t
tellg 返回的是 std::streamoff,它在 64 位系统上通常是 long long,但不保证和 size_t 兼容。用错类型会导致高位截断,超 2GB 文件切片位置直接崩掉。
- 声明变量时写
std::streamoff total = file.tellg();,别写int total = file.tellg(); - 计算每份大小:用
std::streamoff chunk_size = total / n_parts;,除法本身没问题,但后续seekg参数也得是std::streamoff - 循环中定位起点:用
file.seekg(i * chunk_size, std::ios::beg),其中i是int没问题,但乘积结果必须能存进std::streamoff
最后一块总是不准?因为 total % chunk_size 的余数没处理
等分只是数学理想,文件总字节数往往不能被份数整除。如果硬按 chunk_size 循环读,最后一块要么少读(漏数据),要么越界(read 失败但不报错)。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 正确做法:前
n-1块固定读chunk_size字节;最后一块用std::streamsize remaining = total - (n-1) * chunk_size;算出真实长度 - 读取时别只依赖
read(buf, size),要检查file.gcount()—— 它返回实际读到的字节数,可能小于请求值(尤其是最后一块或磁盘 I/O 异常) - 不要用
eof()判断结束,它只在尝试读失败后才置位;应以gcount() == 0为终止信号
用 seekg 跳转后,记得清错误标志再读
seekg 失败(比如跳到文件末尾之后)会设置 failbit,一旦流进入错误状态,后续所有 read 都静默失败。很多人切着切着发现某一块空了,就是这个原因。
立即学习“C++免费学习笔记(深入)”;
- 每次
seekg后加一句file.clear();,清除可能残留的错误标志 - 检查
seekg是否成功:if (!file.good()) { /* 处理定位失败 */ },而不是只看返回值(seekg本身不返回状态) - 特别注意:从
std::ios::end定位时,偏移量为负才合法,正偏移(如seekg(100, std::ios::end))必然失败
真正麻烦的不是怎么切,而是每块读完后要不要 clear()、seekg 失败时怎么降级处理、以及跨平台下 streamoff 的符号扩展——这些细节不写进日志,出问题时根本看不出哪一行埋了雷。


















