我正在尝试学习仿效,同时重新学习C(我在大学时学过它,但最近还没有做过很多)。我正在编写一个chip8模拟器,但是我在将游戏加载到模拟器的内存时遇到了问题。在我看来,问题是我没有正确使用fopen(),我试图创建的文件流也没有找到文件,或者我只是做错了在我的实施中。
void loadGame(char* name) {
//Use fopen to read the program into memory, this loop will use the stream
FILE* game = fopen(name, "r"); //Open the game file as a stream.
unsigned int maxGameSize = 3584; //The max game size available 0x200 - 0xFFF
char gameBuffer[maxGameSize]; //The buffer that the game will be temporarily loaded into.
if (game == NULL) { //THIS IS WHERE THE ERROR HAPPENS. game does == NULL
fprintf(stderr, "The game either can't be opened or doesn't exist!\n");
exit(1);
} else {
while (!feof(game)) {
if (fgets(gameBuffer, maxGameSize, game) == NULL) { //load the file into the buffer.
break; //Reached the EOF
}
}
//Now load the game into the memory.
int counter = 0;
while (counter < maxGameSize) {
memory[counter+512] = gameBuffer[counter];
counter++;
}
}
fclose(game);
}
我在发生逻辑错误的行上的所有大写都发表了评论,因此它会脱颖而出。
这是我的主要方法,供参考。而且我在这个编译代码所在的目录中有一个乒乓球。
int main(int argc, char **argv) {
setupGraphics(); //A stub for now
setupInput(); //Another stub for now.
initialize(); //Yet another stub.
loadGame("PONG");
}
我很欣赏任何人可能有的见解!如果我应该在任何地方添加或更具描述性,请告诉我。
编辑:
我想我是通过MrZebra的信息得到的!我想发布我认为按照我的意愿工作的答案。这是我的新loadGame()方法。
void loadGame(char* name) {
unsigned int maxGameSize = 3584; //This is how many 8-bit cells is available in the memory.
char gameBuffer[maxGameSize]; //Temporary buffer to read game into from file.
FILE* game = fopen(name, "rb");
if (game == NULL) {
perror("Failed to open game.\n");
} else {
printf("Game found.\n");
}
fread(gameBuffer, sizeof(char), maxGameSize, game); //Read file into temp buffer
fclose(game);
//Now load the game into the memory.
int counter = 0;
while (counter < maxGameSize) {
memory[counter+512] = gameBuffer[counter];
counter++;
}
}
答案 0 :(得分:1)
它看起来像一个简单的“找不到文件”或“拒绝访问”。仔细检查可执行文件是否真的在您认为的位置 - 取决于您的构建环境,它可能位于\ Debug子目录或类似的东西之下。
另外我猜你的数据是二进制文件 - fgets()
用于阅读文本,你想要fread()
,你应该以二进制模式"rb"
打开文件。
答案 1 :(得分:0)
如果
FILE* game = fopen(name, "r");
结果为game == NULL
,可能意味着fopen()
无法找到“PONG”。
你的行的论点:
loadGame("PONG");
应该是一条路径,例如:
"c:\\pongdev\\pong.exe"