我在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] = ' ';
fclose(bestand);
return buffer;
}
查看fread_s的返回值,它是读取到缓冲区的字节数。这可能比预期的要少。
bytes_read = fread_s(buffer, handle.st_size, fileSize, 1, bestand);
buffer[bytes_read] = ' ';
编辑:你必须交换计数/大小参数才能使我说的正确:
bytes_read = fread_s(buffer, handle.st_size, 1, fileSize, bestand);
buffer[bytes_read] = ' ';
此
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:要读取的最大项目数。
stream:指向FILE结构的指针。
您将elementSize
设置为filesize
,这意味着每个元素都是filesize
字节,而它应该是1字节。
请去掉
handle.st_size++;
并插入
buffer = (char*)malloc(sizeof(char) * ( handle.st_size + 1 ) );
和
fread_s(buffer, handle.st_size + 1, 1, handle.st_size, bestand);
希望有帮助:)