我正在从文件中读取字符串。在第二次或第三次执行函数之后,一个或多个随机字符会附加到缓冲区字符串中,我不知道为什么会发生这种情况。
这是一段代码:
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);
}
我在这里做错了吗?
答案 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);
会解决此问题。