我正在读取文件的内容并尝试打印它,但它提供了额外的垃圾值。
#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
#include <stdlib.h>
int main() {
long length;
char* content;
FILE *file = fopen("text.txt", "r");
fseek(file, 0, SEEK_END);
length = ftell(file);
fseek(file, 0, SEEK_SET);
content = (char *)malloc(length);
fread(content, 1, length, file);
printf("%s\n", content);
return 0;
}
也许我必须取消终止
content[length] = '\0';
?
文件末尾的
\n
换行符越多,我得到的垃圾就越多。
除了使用
calloc
之外还有什么解决方案吗?
如果这是 MSVC(由
#define _CRT_SECURE_NO_DEPRECATE
提示),那么默认情况下文件模式可能是 text,并且当您读取它时,所有 CR-LF 对将收缩为单个 LF。获取文件大小并没有考虑到这一点。使用实际读取的字符数来终止字符串。
content = malloc(length + 1); // room for terminator
size_t bytes = fread(content, 1, length, file);
content[bytes] = '\0';
文件内容不以空字符结尾。 您应该将分配的内存缓冲区重置为 0,因为不知道将读取多少字节。
content = (char *)malloc(length + 1);
memset(content, 0, length + 1);
fread(content, 1, length, file);
或者您应该在打印时设置数据长度
length = fread(content, 1, length, file);
printf("%.*s\n", length, content);
试试这个方法
char buffer[14]; int cnt = 0;
buffer[13] = '\0';
while(fread(buffer, 13, 1 ,fptr) != NULL){
printf("Buffer #%d :: %s\n", ++cnt, buffer);
}
添加 到数组末尾将导致不溢出。