我正在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';

09-10 00:48
查看更多