C语言统计二进制文件字节数代码提交超时(Time Limit Exceeded)求解
代码超时问题修复方案
问题背景
题目要求:输入一个两位十六进制数,统计二进制文件a.dat中取值与该十六进制数完全相等的字节总数,将统计结果按照"%d\n"格式写入文本文件b.txt。
原提交代码运行时触发Time Limit Exceeded(运行超时)错误。
原代码核心问题
- 二进制文件读取逻辑完全错误:使用
fscanf(in,"%x",p++)是按文本格式解析可读的十六进制字符串,而a.dat是存储原始字节的二进制文件,不存在格式化的十六进制文本,该调用要么无法读取到有效内容触发死循环,要么解析结果完全不符合要求,是造成超时的核心原因。 - 存在严重的内存越界风险:定义的
int a[100]仅能存储100个整型值,只要a.dat文件大小超过对应阈值,写指针p就会越界篡改其他内存数据,触发未定义行为。 - 存在不必要的性能开销:无需将整个文件内容全部读入内存缓存,逐字节读取时同步统计即可完成需求,原逻辑多了一次全量遍历的开销,大文件下会拉长运行时间。
- 基础写法不规范:缺少
<stdio.h>头文件引用,main函数未写标准返回类型,写入文本文件误用二进制打开模式。
修复后代码
#include <stdio.h> #include <stdlib.h> int main() { FILE *in, *out; int target, ch; long count = 0; // 读取用户输入的目标十六进制值 scanf("%x", &target); target &= 0xFF; // 限定为单字节范围,避免输入越界导致匹配错误 in = fopen("a.dat", "rb"); out = fopen("b.txt", "w"); // 逐字节读取二进制文件,边读边统计,无需缓存全文件 while ((ch = fgetc(in)) != EOF) { if ((ch & 0xFF) == target) { count++; } } fprintf(out, "%ld\n", count); fclose(in); fclose(out); return 0; }
修复逻辑说明
- 替换错误的文件读取接口:使用
fgetc()逐字节读取二进制文件的原始字节值,彻底解决原格式化读取接口导致的死循环超时问题。 - 移除固定长度数组缓存:改为读取时同步计数,没有文件大小限制,不会触发内存越界,同时减少了一次全量数组遍历的开销,运行效率更高。
- 增加单字节范围校验:对输入值、读取到的字节值都做0xFF掩码处理,避免非单字节值干扰匹配结果。
- 修正不规范的语法写法,补全必要头文件,使用匹配场景的文件打开模式。
内容的提问来源于stack exchange,提问作者cat
相关产品推荐
相关产品推荐

