0

所以我正在编辑代码,并且有一个完全没有注释的代码块,所以我担心对其进行任何更改,这一切都始于这个 while 语句。

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

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

3 回答 3

4

让我们分解一下。

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

接下来, from 的返回值fread存储在cnt. 所以cnt现在包含 . 读取的字节数fread

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

所有这些放在一起意味着如果从filein. 一旦进入循环,cnt将包含已读取的字节数,buf并将包含从文件中读取的实际字节数。

于 2013-09-13T21:28:20.757 回答
3

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

现在将其与 C 中的赋值评估为赋值的事实相结合。IE

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. 如果是,则表达式为真,while 循环继续。

这最终是一种保留从调用中读取的项目数量的有点尘土飞扬的方式,fread()因此它可以在cnt声明的任何范围内的后续代码中使用。

于 2013-09-13T21:29:21.160 回答
0

继续从 中读取数据,一次最多 16 个字节filein,直到发生 EOF 的 I/O 错误。

while ((cnt = (long) fread (buf, sizeof (unsigned char), 16, filein ) ) > 0);
于 2013-09-13T21:20:15.433 回答