我想从文件中读取一些数据,这些数据在不同的时间会有不同的大小。
如果我使用下面的代码,那么:
char dataStr[256];
fread(dataStr, strlen(dataStr), 1, dFd);对于上面的调用,fread返回0,并且不从文件中读取任何内容。
但是,如果我将大小设为1,那么它会成功地从文件中读取一个char。
当我们不知道文件中数据的大小时,fread()函数的size参数值应该是多少?
发布于 2010-09-13 14:59:05
strlen计算达到\0之前的字符数。
在本例中,您可能在第一个字符上命中了\0,因此strlen返回0作为长度,并且不读取任何内容。
你应该用sizeof代替strlen。
发布于 2010-09-13 14:59:18
显然,你不能这么做。
您可以一直读到一个已知的分隔符,通常是换行符,使用fgets()读取一行。或者,您可以使用该参数读取已知的提前字节计数。
当然,如果数据量有一个上限,你可以总是读取它,然后以某种方式检查数据,看看你得到了什么。
此外,在您的示例中,您在将要被覆盖的参数上使用了strlen(),这意味着它已经包含了一个与要读取的数据大小完全相同的正确字符串。这似乎不太可能,你可能指的是sizeof dataStr。
发布于 2010-09-13 14:58:09
您应该使用:
fread(dataStr, 1, sizeof dataStr, dFd);以指示要读取的字节数等于数组缓冲区的大小。
代码不能工作的原因是strlen()查找以NULL结尾的字符串的长度,而不是缓冲区的大小。在您的例子中,您在一个未初始化的缓冲区上运行它,幸运的是,缓冲区中的第一个字节是空的,因此strlen(dataStr)返回0,但也有可能崩溃或返回某个大于缓冲区大小的随机数。
还要注意,fread()返回的是读取的项数,而不是字符数(我交换了第二个和第三个参数,以便每个字符等同于一个项)。
https://stackoverflow.com/questions/3698332
复制相似问题