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

Emscripten预加载二进制文件异常:仅读取21字节而非预期494字节

问题原因与解决方案

核心原因

你遇到的问题本质是文本模式读取二进制文件导致的提前终止:
Emscripten的虚拟文件系统在文本模式下会严格识别ASCII控制字符0x1A(DOS/Windows传统EOF标记)为文件结束位置,而你的Tetris.ch8二进制文件刚好在第21字节后包含该字符,所以所有读取操作都会在此时停止。非Emscripten环境的MinGW对本地文件的文本模式处理更宽松,未触发该逻辑,因此能正常读取完整文件。而纯文本文件不含这类控制字符,所以文本模式读取正常。

解决方法

所有文件操作都必须明确指定二进制模式:

  • 使用C++ std::ifstream时:
    // 必须添加std::ios::binary标记
    std::ifstream rom_file("Tetris.ch8", std::ios::in | std::ios::binary);
    
  • 使用C风格FILE*时:
    // 用"rb"(读二进制)替代默认的"r"(读文本)
    FILE* fp = fopen("Tetris.ch8", "rb");
    
  • 对于std::filesystem::file_size,确保没有以文本模式打开过目标文件(否则可能残留错误的文件状态),或者配合二进制模式打开的文件对象获取大小:
    std::ifstream rom_file("Tetris.ch8", std::ios::binary);
    rom_file.seekg(0, std::ios::end);
    std::streampos file_size = rom_file.tellg();
    rom_file.seekg(0, std::ios::beg);
    

验证建议

你可以查看Tetris.ch8文件的字节内容,第22字节(索引从0开始为第21位)应该是0x1A,这就是文本模式下读取停止的触发点。

内容的提问来源于stack exchange,提问作者Master Yoda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 06:22:08