与C的fwrite函数的参数混淆

时间:2016-02-02 11:13:57

标签: c fwrite fread

我现在正在学习C语言。我在tutorialspoint.com中遇到了freadfwrite个函数。基本上,这两个函数的声明都是一样的:

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)

该网站中的每个功能都有一些示例。至于fwrite函数:

fwrite(str , 1 , sizeof(str) , fp );

我完全可以理解这一点。但至于fread函数:

fread(buffer, strlen(c)+1, 1, fp);

为什么1参数位于strlen(c)+1参数之后?这是某种错误还是我应该知道的?

提前致谢。

3 个答案:

答案 0 :(得分:2)

  

为什么1参数出现在sizeof(str)参数之前?

1sizeof( char )

fwrite最好写成:

fwrite(str , sizeof(char) , sizeof(str) , fp );

答案 1 :(得分:2)

阅读例如this fread referencethis fread POSIX specification告诉我们size参数是每个元素的大小(例如sizeof(some_type)),而nmemb是要读取的元素的数字(例如strlen(some_string))。当然fwrite也是如此。

在大多数情况下,切换传递的值的位置并不重要,如果一切正常,那么size * nmemb字节将被读取(或写入)。当从文件中读取或写入错误时会出现问题,因此最好尝试记住哪个参数是哪个。

答案 2 :(得分:1)

来自here

  

大小 - 要写入的每个元素的字节大小。 size_t是无符号整数类型。

     

计数 - 元素数量,每个元素的大小为字节大小。   size_t是无符号整数类型。

您可以互换大小和数量,在正常情况下不会有任何区别。正如 2501 所提到的,如果无法从文件中读取任何元素,它将会有所不同。

给出的示例将在正常情况下起作用,但应进行更正,以便为size提供countfread的正确值

fread(buffer, 1, strlen(c)+1, fp);