我是C的新手,最近我一直致力于一个程序,我正在从一个文件中读取一个512字节的流,使用fread进入一个数组,然后在检查该字节流中的某些条件后,我正在编写使用fwrite将字节流转换为新文件 相同的代码片段是
unsigned char buffer[512];
FILE *fp = fopen("file.name","r");
if(fp == NULL)
{
perror("Error opening the file\n ");
fclose(fp);
return -1;
}
while(fread(&buffer, sizeof(buffer), 1 , fp) == 1) //my program works fine for both &buffer and only buffer
{
//Do something
}
fread的定义是:
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
这里ptr是指向存储读取字节的内存块的指针。
我已经将缓冲区定义为字符数组,因此只传递buffer
作为第一个参数应该已经足够了,因为它是一个指针,但即使提供&buffer
,程序也能正常工作。 fwrite也是如此。现在如果buffer
是指针,则&buffer
是指针的地址,并且不应该与指针的结果具有相同的结果,但它实际上是,所以为什么函数正常工作两个参数不同?
答案 0 :(得分:3)
在C中,任何数据指针类型都可以隐式转换为void*
:
buffer
指定数组。它不是指针。几乎所有上下文中的数组都转换为指向其第一个元素的指针。&buffer
这是一个例外,所以这里我们有一个指向所述数组的指针。无论如何,你可能想要这样做:
size_t count;
while((count = fread(buffer, 1, sizeof(buffer), fp)) > 0)
为什么?
sizeof(buffer)
块完成后才会执行。