首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fread()大小参数

fread()大小参数
EN

Stack Overflow用户
提问于 2010-09-13 14:55:27
回答 4查看 3.6K关注 0票数 1

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

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

代码语言:javascript
复制
char dataStr[256];

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

对于上面的调用,fread返回0,并且不从文件中读取任何内容。

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

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

EN

回答 4

Stack Overflow用户

发布于 2010-09-13 14:59:05

strlen计算达到\0之前的字符数。

在本例中,您可能在第一个字符上命中了\0,因此strlen返回0作为长度,并且不读取任何内容。

你应该用sizeof代替strlen

票数 3
EN

Stack Overflow用户

发布于 2010-09-13 14:59:18

显然,你不能这么做。

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

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

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

票数 2
EN

Stack Overflow用户

发布于 2010-09-13 14:58:09

您应该使用:

代码语言:javascript
复制
fread(dataStr, 1, sizeof dataStr, dFd);

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

代码不能工作的原因是strlen()查找以NULL结尾的字符串的长度,而不是缓冲区的大小。在您的例子中,您在一个未初始化的缓冲区上运行它,幸运的是,缓冲区中的第一个字节是空的,因此strlen(dataStr)返回0,但也有可能崩溃或返回某个大于缓冲区大小的随机数。

还要注意,fread()返回的是读取的项数,而不是字符数(我交换了第二个和第三个参数,以便每个字符等同于一个项)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3698332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档