我想从文件中读取一些数据,数据在不同的时间会有不同的大小。
如果我使用以下代码,那么:
char dataStr[256];
fread(dataStr, strlen(dataStr), 1, dFd);
fread
为上述调用返回0,而不是从文件中读取任何内容。
但是,如果我将大小设为1,则它会成功从文件中读取一个char
。
当我们不知道文件中数据的大小有多少时,fread()
函数的size参数值应该是多少?
答案 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'。