读取文件时出现随机存储器

时间:2013-02-08 21:27:22

标签: c file fread

我已经创建了一个函数,它将文件读入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;
}

3 个答案:

答案 0 :(得分:1)

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

应该是

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

根据docs,函数fread_s接受以下内容:

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

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

     

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

     

elementSize:要读取的项目大小。

     

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

     

stream:指向FILE结构的指针。

您将elementSize设置为filesize,这意味着每个元素都是filesize个字节,当它应该是1个字节时。

答案 1 :(得分:1)

查看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';

答案 2 :(得分: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);

希望有所帮助:)