C - 一次读取一个文件并将内容写入数组中

时间:2014-04-26 19:05:19

标签: c fopen

我正在尝试学习仿效,同时重新学习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++;
    }
}

2 个答案:

答案 0 :(得分:1)

它看起来像一个简单的“找不到文件”或“拒绝访问”。仔细检查可执行文件是否真的在您认为的位置 - 取决于您的构建环境,它可能位于\ Debug子目录或类似的东西之下。

另外我猜你的数据是二进制文件 - fgets()用于阅读文本,你想要fread(),你应该以二进制模式"rb"打开文件。

答案 1 :(得分:0)

如果

FILE* game = fopen(name, "r");  

结果为game == NULL,可能意味着fopen()无法找到“PONG”。

你的行的论点:

loadGame("PONG");  

应该是一条路径,例如:

"c:\\pongdev\\pong.exe"