解读一段时间的陈述

时间:2013-09-13 21:03:10

标签: c printing buffer sizeof

所以我正在编辑代码并且是一段完全取消注释的代码,因此我担心对它进行任何更改,这一切都从这个while语句开始。

有人可以解读这个吗?从技术上描述这是在说什么/做什么,我相信我能弄清楚我理解的第一行所有其他内容。

while ( ( cnt = ( long ) fread ( buf, sizeof ( unsigned char ), 16, filein ) ) > 0 )

3 个答案:

答案 0 :(得分:4)

让我们把它分解。

首先调用fread(buf, sizeof(unsigned char), 16, filein)。此函数从filein指定的文件中读取最多16个下一个字节,将它们存储在buf中,并返回读取的字节数。

接下来,fread的返回值存储在cnt中。因此cnt现在包含fread读取的字节数。

最后,循环检查是否cnt > 0

所有这些放在一起意味着如果从filein读取至少1个字节,代码将进入循环。进入循环后,cnt将包含已读取的字节数,buf将包含从文件中读取的实际字节数。

答案 1 :(得分:3)

首先,知道fread()做什么以及返回什么可能会有所帮助。它尝试读取指定大小的指定数量的对象,将结果存储在调用者提供的缓冲区中。返回值是成功读取的对象数。

现在将其与C中的分配作为分配值的事实相结合。即。

int a;
int b = (a = 20);

表示将20分配给a,然后将得到的评估表达式分配给b。由于(a=20)评估为20,b将为20。

现在看看有问题的代码:

while ( (cnt = (long)fread(buf, sizeof (unsigned char), 16, filein)) > 0 )

从内到外,这会做到以下几点:

  1. 调用fread(buf, sizeof (unsigned char), 16, filein)。这要求读取最多16个项目,每个项目的大小为unsigned char
  2. 将结果投射到long
  3. 将结果分配给cnt
  4. 将结果表达式与零进行比较,以确定它是否更大。
  5. 如果是,则表达式为true,while循环继续。
  6. 这最终是一种保持从fread()调用中读取的项目数量的尘土飞扬的方式,因此可以在以后的代码中使用cnt声明的任何范围。

答案 2 :(得分:0)

一直读取最多16个字节,来自filein的数据,直到发生EOF的I / O错误。

while ((cnt = (long) fread (buf, sizeof (unsigned char), 16, filein ) ) > 0);