在我的项目中,我需要将共享文件复制到一个名为 share 的目录中。我的想法是使用 fgets 和 fputs 复制这个文件的内容:
FILE *fp;
int size;
char *fileBuff
fseek(fp,0,SEEK_END );
size=ftell(fp);
printf("Size of %s: %d bytes.\n",path,size); // print correct size
fileBuff=malloc(size); // mallocate the file buffer
printf("\nsize of file buffer is %d",sizeof(fileBuff)); //always print 4!!
while(!feof(fp)){
fgets(fileBuff,size,fp); // put into file buffer
}
printf("\nsize of file buffer is %d",sizeof(fileBuff)); // also print 4!!
但是,文件缓冲区不能分配,这个文件缓冲区的大小总是 4。发生了什么事?
更新: 好像有些误会。 sizeof() 只是为了让我检查文件缓冲区中是否存储了任何东西。我确实尝试了 strlen(fileBuff),它总是给我 1。
最佳答案
这是错误的:sizeof(fileBuff)
.这将是指针的大小,在您的系统上为 4。
您不能使用 sizeof
“提取”由 malloc()
返回的内存块的大小.您不能使用 anything 来提取该大小,这在(标准)C 中根本不可能。您需要使用 size
值,即 malloc()
的参数.
此外,<a href="http://linux.die.net/man/3/ftell" rel="noreferrer noopener nofollow">ftell()</a>
返回 long
, 不是 int
和两个malloc()
并且各种 I/O 调用可能会失败,您需要考虑到这一点。
在我看来,使用文件大小的缓冲区来进行简单复制并不是一个好主意;最好使用“合理的”缓冲区(其确切的最佳大小取决于很多因素),然后在循环中重复读写对,直到流过整个文件。
更新关于您的代码的更多要点:
- 你谈论使用
strlen()
但代码显示sizeof
在fread()
之后,也是。 - 你谈论使用
sizeof
“检查”缓冲区中是否有任何东西,这是不可能的;任何带有sizeof
的表达式总是在编译时评估1,它不能用于检查这样的动态事物。同样,您不能使用它来计算malloc()
返回的内存块的大小。 . - 使用
strlen()
在保存文件数据的缓冲区上,只有当文件是二进制文件并且在其最后位置包含“\0”时才能可靠地工作,否则你将有一个未终止的字符串和strlen()
可能会调用未定义的行为。 - 如我所说,您需要检查
malloc()
返回NULL
,如果未能分配请求的内存块,它将执行此操作。
1 除了flexible arrays在 C99 中,但让我们忽略它。
关于c - Malloc 基于现有文件的文件缓冲区大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10138192/