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
相关产品推荐
相关产品推荐

