C 读取文件失败

C 读取文件失败,c,file,fread,C,File,Fread,我正在从文件中读取字符串。在第二次或第三次执行函数之后,一个或多个随机字符会附加到缓冲字符串中,我不知道为什么会发生这种情况 下面是一段代码: scorefile = fopen("highscore.dat", "rb"); if (scorefile) { fseek(scorefile, 0, SEEK_END); length = ftell(scorefile); fseek(scorefile, 0, SEEK_SET); buffer = mall

我正在从文件中读取字符串。在第二次或第三次执行函数之后,一个或多个随机字符会附加到缓冲字符串中,我不知道为什么会发生这种情况

下面是一段代码:

scorefile = fopen("highscore.dat", "rb");

if (scorefile)
{
    fseek(scorefile, 0, SEEK_END);
    length = ftell(scorefile);
    fseek(scorefile, 0, SEEK_SET);
    buffer = malloc(length);
    if (buffer)
    {
        fread(buffer, 1, length, scorefile);
    }
    fclose(scorefile);
}

我在这里做错了什么吗?

如果使用buffer=malloclength;,然后将长度字节读入其中,它将太短一个字节。C中的字符数组以零结尾,因此它们需要一个额外的字节来替换该零。缓冲区=malloclength+1;将解决此问题。

让我们把它全部拼出来,稍微健壮一点:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

char *loadScoreFile(const char *filename)
{
    char *buffer = NULL;

    FILE *scorefile = fopen(filename, "r");

    if (scorefile != NULL)
    {
        (void) fseek(scorefile, 0, SEEK_END);
        int length = ftell(scorefile);

        (void) fseek(scorefile, 0, SEEK_SET);

        buffer = malloc(length + 1);

        if (buffer != NULL)
        {
            assert(length == fread(buffer, 1, length, scorefile));

            buffer[length] = '\0';
        }
        (void) fclose(scorefile);
    }

    return buffer;
}

int main()
{
    for (int i = 0; i < 10; i++)
    {
        char *pointer = loadScoreFile("highscore.dat");

        if (pointer != NULL)
        {
            printf("%s", pointer);
            free(pointer);
        }
    }

    return 0;
}

如何进行调试和/或正确实现?是否打印hiscore.dat的结果?我的crystal ball认为您将缓冲区视为以零结尾的字符串,除非您的文件末尾有一个零。@Uwe Klein:我正在围绕此函数进行错误处理。在调试过程中,我只能看到在调用fread之前缓冲区是空的,在调用之后,文件中的内容是空的,但也是不需要的字符。如何对其进行更深入的调试?那么在编写文件时就会出现问题。它应该包含什么?ascii码?二进制?不幸的是,它没有。scorefile的内容是10 Test;打印的结果是:@Kai,这是因为未经修改就运行了上述代码?我用你提到的内容运行了它,并且只得到了10次测试;一遍又一遍。您可以尝试将开放模式从rb更改为简单的r,因为我们只是在阅读文本,看看这是否会有所不同。否则,我不知道。您可能会在fopen窗口中搜索SO,以查看是否存在已知的故障。可能是我的程序中的其他原因导致的吗?就像其他地方的虫子一样,我只看到了原因。毕竟,我真的只是想从一个文件中读取文本-不知道为什么它看起来如此受诅咒。。。