所以我正在编辑代码并且是一段完全取消注释的代码,因此我担心对它进行任何更改,这一切都从这个while语句开始。
有人可以解读这个吗?从技术上描述这是在说什么/做什么,我相信我能弄清楚我理解的第一行所有其他内容。
while ( ( cnt = ( long ) fread ( buf, sizeof ( unsigned char ), 16, filein ) ) > 0 )
答案 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 )
从内到外,这会做到以下几点:
fread(buf, sizeof (unsigned char), 16, filein)
。这要求读取最多16个项目,每个项目的大小为unsigned char
。long
cnt
这最终是一种保持从fread()
调用中读取的项目数量的尘土飞扬的方式,因此可以在以后的代码中使用cnt
声明的任何范围。
答案 2 :(得分:0)
一直读取最多16个字节,来自filein
的数据,直到发生EOF的I / O错误。
while ((cnt = (long) fread (buf, sizeof (unsigned char), 16, filein ) ) > 0);