我已经创建了一个函数,它将文件读入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;
}
答案 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);
希望有所帮助:)