0

我已经制作了一个函数,可以将文件读入 C 中的内存。但是我遇到了代码问题,随机字符似乎出现在字符串的末尾。即使我在最后添加了 '\0' 。我根本不明白这一点,因为整个文件都出现了,而且我没有足够的空间来容纳更多的字符,所以如果有更多的字符,应该会有某种错误?无论如何,有人知道是什么原因造成的吗?

char* LoadSourceFile(char* filename)
{
    int fileSize;
    char* buffer;
    struct stat handle;
    FILE* bestand;

    stat(filename, &handle);
    if (fopen_s(&bestand, filename, "r") != 0) {
        return NULL;
    }

    fileSize = handle.st_size;
    handle.st_size++;
    buffer = (char*)malloc(handle.st_size);
    if (buffer == NULL) {
        return buffer;
    }

    fread_s(buffer, handle.st_size, fileSize, 1, bestand);
    buffer[fileSize] = '\0';
    fclose(bestand);

    return buffer;
}
4

3 回答 3

0

fread_s(buffer, handle.st_size, fileSize, 1, bestand);

应该

fread_s(buffer, handle.st_size, 1, fileSize, bestand);

根据文档,该函数fread_s接受以下内容:

size_t fread_s(void *buffer,size_t bufferSize, size_t elementSize, size_t count, FILE *stream );

缓冲区:数据的存储位置。

bufferSize:目标缓冲区的大小(以字节为单位)。

elementSize:要读取的项目的大小(以字节为单位)。

count:要读取的最大项目数。

流:指向 FILE 结构的指针。

您将其设置elementSizefilesize意味着每个元素都是filesize字节,而它应该是 1 个字节。

于 2013-02-08T21:32:44.377 回答
0

查看 fread_s 的返回值,它是读取到缓冲区的字节数。它可能低于预期。

bytes_read = fread_s(buffer, handle.st_size, fileSize, 1, bestand);
buffer[bytes_read] = '\0';

编辑:您必须交换计数/大小参数才能使我所说的正确:

bytes_read = fread_s(buffer, handle.st_size, 1, fileSize, bestand);
buffer[bytes_read] = '\0';
于 2013-02-08T21:33:54.533 回答
0

请脱掉

handle.st_size++;

并插入

buffer = (char*)malloc(sizeof(char) * ( handle.st_size + 1 ) );

fread_s(buffer, handle.st_size + 1, 1, handle.st_size, bestand);

希望能帮助到你 :)

于 2013-02-08T21:41:57.303 回答