fread()大小参数

时间:2010-09-13 06:55:27

标签: c

我想从文件中读取一些数据,数据在不同的时间会有不同的大小。

如果我使用以下代码,那么:

char dataStr[256];

fread(dataStr, strlen(dataStr), 1, dFd);

fread为上述调用返回0,而不是从文件中读取任何内容。

但是,如果我将大小设为1,则它会成功从文件中读取一个char

当我们不知道文件中数据的大小有多少时,fread()函数的size参数值应该是多少?

4 个答案:

答案 0 :(得分:3)

strlen计算字符数,直至达到\ 0。
在这种情况下,您可能在第一个字符上按\ 0,因此strlen返回0作为长度,没有任何内容被读取。

您可以使用sizeof代替strlen

答案 1 :(得分:2)

显然你不能这样做。

您可以使用fgets()读取一行来读取已知分隔符(通常是换行符)。或者,您可以使用该参数读取已知的预先字节计数。

当然,如果数据量有一个上限,你可以随时读取,然后以某种方式检查数据,看看你得到了什么。

此外,在您的示例中,您将对将要覆盖的参数使用strlen(),这意味着它已包含与要读取的数据完全相同大小的正确字符串。这似乎不太可能,你可能意味着sizeof dataStr那里。

答案 2 :(得分:1)

您应该使用:

fread(dataStr, 1, sizeof dataStr, dFd);

表示您要读取等于数组缓冲区大小的字节数。

您的代码不起作用的原因是strlen()找到以NULL结尾的字符串的长度,而不是缓冲区的大小。在你的情况下,你在一个未初始化的缓冲区运行它,只是幸运,缓冲区中的第一个字节是NULL,所以strlen(dataStr)返回0,但是可能会崩溃或返回一个大于缓冲区的随机数大小

另请注意,fread()返回读取的的数量,而不是字符数(我交换了第二个和第三个参数,以便每个字符相当于一个项目)。

答案 3 :(得分:-2)

fread返回成功呈现的numblocks的数量。 你可以:

if( 1==fread(dataStr, 256, 1, dFd) )
  puts("OK");

它读取定义数据的全长;恐惧不能打破'\ 0'。