所以我正在编辑代码,并且有一个完全没有注释的代码块,所以我担心对其进行任何更改,这一切都始于这个 while 语句。
有人可以破译这个吗?从技术上描述这是在说什么/在做什么,我相信我可以弄清楚我理解第一行的所有其他内容。
while ( ( cnt = ( long ) fread ( buf, sizeof ( unsigned char ), 16, filein ) ) > 0 )
让我们分解一下。
首先fread(buf, sizeof(unsigned char), 16, filein)
被称为。此函数从 指定的文件中读取最多 16 个接下来的字节filein
,将它们存储在 中buf
,并返回已读取的字节数。
接下来, from 的返回值fread
存储在cnt
. 所以cnt
现在包含 . 读取的字节数fread
。
最后,循环检查是否 cnt > 0
.
所有这些放在一起意味着如果从filein
. 一旦进入循环,cnt
将包含已读取的字节数,buf
并将包含从文件中读取的实际字节数。
首先,它可能有助于了解做什么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 )
从内到外,它执行以下操作:
fread(buf, sizeof (unsigned char), 16, filein)
. 这要求读取最多 16 个项目,每个项目的大小为unsigned char
.long
cnt
这最终是一种保留从调用中读取的项目数量的有点尘土飞扬的方式,fread()
因此它可以在cnt
声明的任何范围内的后续代码中使用。
继续从 中读取数据,一次最多 16 个字节filein
,直到发生 EOF 的 I/O 错误。
while ((cnt = (long) fread (buf, sizeof (unsigned char), 16, filein ) ) > 0);