关于C中的fwrite()和fread()参数的困惑

时间:2014-07-03 21:55:20

标签: c function fwrite

我是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是指针的地址,并且不应该与指针的结果具有相同的结果,但它实际上是,所以为什么函数正常工作两个参数不同?

1 个答案:

答案 0 :(得分:3)

在C中,任何数据指针类型都可以隐式转换为void*

  • buffer指定数组。它不是指针。几乎所有上下文中的数组都转换为指向其第一个元素的指针。
  • &buffer这是一个例外,所以这里我们有一个指向所述数组的指针。

无论如何,你可能想要这样做:

size_t count;
while((count = fread(buffer, 1, sizeof(buffer), fp)) > 0)

为什么?

  • 因为您想要阅读所有数据,而不是错过最后的部分区块。
  • 在交互式设备上,您希望尽早对数据执行操作,而不是等到完整的sizeof(buffer)块完成后才会执行。