我正在VS2010 Windows 7中用c++编写。我尝试读取大小为64字节的文件。这是代码:
BYTE* MyReadFile(FILE *f)
{
size_t result;
BYTE *buffer;
long lSize;
if (f == NULL)
{
fputs ("File error", stderr);
exit (1);
}
fseek (f, 0, SEEK_END);
lSize = ftell (f);
rewind (f);
//buffer = (BYTE*) malloc (sizeof(char)*lSize);
buffer = new BYTE[lSize];
if (buffer == NULL)
{
fputs ("Memory error", stderr);
exit (2);
}
result = fread (buffer, 1, lSize, f);
if (result != lSize)
{
fputs ("Reading error",stderr);
exit (3);
}
fclose (f);
return buffer;
}
当我得到文件大小时,它是64,但是当我用新的BYTE [lSize]为它分配内存时,我得到了80个字节的空间,因此奇怪的序列ээээ«««««««оюою被添加到缓冲。你能告诉我如何处理吗?
最佳答案
分配的字节数与看到的字节数之间存在重要差异。
如果lsize为64,则实际上已经为您分配了64个字节。这并不意味着在屏幕后面,C++运行时将向Windows询问确切的64个字节。在实践中,内存管理器要求更多的内存,以便他们能够做自己的作业。通常,这些额外的字节是在从new / malloc返回的指针之前分配的,因此您永远不会看到它们。
但是,这不是您的问题。问题是您使用fread从文件读取了64个字节。 fread不可能知道您正在读取哪种数据。它可能是一个结构,一个char缓冲区,一组 double 数,...它只是为您读取这些字节。
这意味着,如果文件中包含字符“ABC”,则将返回“ABC”。但是,在C中,字符串应以nul结尾,因此,如果将此缓冲区传递给printf,它将继续扫描内存,直到找到nul字符为止。
因此,要解决您的问题,请再分配1个字节,并将最后一个字节设置为nul字符,如下所示:
buffer = new BYTE[lSize+1];
buffer[lSize] = '\0';