You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 04:55:19