C++开发Chip8模拟器调用fopen无法打开同目录rom文件求助
问题核心原因
你运行make run执行程序时,程序的当前工作目录是Makefile所在的项目根目录,而非bin目录。你传入的相对路径"picture.ch8"会让程序去项目根目录下查找文件,自然找不到你放在bin目录下的rom文件。
解决方案
1. 修复路径读取问题
二选一即可:
- 直接把
picture.ch8放到项目根目录(和Makefile同层级) - 修改Makefile的
run目标,先切换到bin目录再执行程序,修改后代码如下:
run : cd $(OUTDIR) && ./$(OUT)
2. 附加排查建议
如果修改后还是报错,可以在OpenFile的错误分支加perror("fopen error"),可以打印出系统级的错误原因,方便定位是权限问题、文件名拼写错误还是其他问题。
你代码中存在的其他隐患
如果不修复,后续运行还是会出现崩溃、读取异常等问题:
GetRomSize函数逻辑错误
原代码写的是int size = end - size;,这里size是未初始化的随机值,正确写法应该是int size = end - start;,才能得到正确的rom文件大小。- 类成员未初始化
你没有写RomReader的构造函数,m_Reader和m_Rom初始都是野指针,GetRom中if(m_Rom == NULL)的判断会失效,建议添加构造函数初始化成员:
RomReader::RomReader() : m_Reader(NULL), m_Rom(NULL) {}
- 内存分配释放不匹配
你用new uint8_t[size]分配数组,却用free()释放,属于未定义行为,应该把free(m_Rom)改成delete[] m_Rom。 - 重复释放内存
main函数中你已经用free(rom)释放了内存,后续又调用romReader.FreeRom(),等于对同一块内存释放两次,会直接导致程序崩溃,删掉main里的free(rom)即可。
内容的提问来源于stack exchange,提问作者karthikkk
相关产品推荐
相关产品推荐

