C - 读取整个文件最后带有垃圾

Mar*_*rco 3 c file

所以我试图使用这个函数读取整个文本文件:

FILE *fp = fopen(path, "r");
fseek(fp, 0, SEEK_END);
int tamanioArchivo = sizeof(char) * ftell(fp);
fseek(fp, 0, SEEK_SET);
char* archivo = malloc(tamanioArchivo + 1);
fread(archivo, tamanioArchivo + 1, 1, fp);
//do something with archivo
fclose(fp);
free(archivo);
Run Code Online (Sandbox Code Playgroud)

我调试了它,问题似乎就fread行了。它带回文件并在最后添加一些垃圾。任何想法我做错了什么?

Max*_*Max 5

通常 C不关心文件的内容是什么。无论是文本数据还是二进制数据,都以相同的方式读取。意思是如果你想读取一个字符串并得到一些很好的以 null 结尾的东西,你需要自己处理。

fread(archivo, tamanioArchivo+1, 1, fp);
Run Code Online (Sandbox Code Playgroud)

这会读取一个额外的字节(同样,空终止是 C 语言,文件系统不会强制执行此操作)。去掉加号 1。然后你必须确保它是空终止的:

archivo[tamanioArchivo] = '\0';
Run Code Online (Sandbox Code Playgroud)

  • 请注意,您仍然必须_分配_一个额外的字节;也就是说,`malloc` 调用在原始代码中是正确的。 (3认同)