从文件读取失败

时间:2016-09-04 13:57:05

标签: c file fread

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

这是一段代码:

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);
}

我在这里做错了吗?

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

如果您使用buffer = malloc(length);,然后将length字节读入其中,则它将是一个字节太短。 C中的字符数组是零终止的,因此它们需要一个额外的字节,但该零。 buffer = malloc(length+1);会解决此问题。