以下是该计划:
FILE *fp;
struct record rec;
while (fread((char *)&rec, sizeof(rec), 1, fp) == 1) // Here
{
/* do something to rec */
if (/*rec must be rewritten*/)
{
fseek(fp, -(long)sizeof(rec), 1);
fwrite((char*)&rec, sizeof(rec), 1, fp); // And here
}
}
看看笔记,作者说:
初看起来看起来很合理:
&rec
会谨慎转为char *
传递给fread
和fwrite
......
我无法理解其含义。
答案 0 :(得分:4)
首先,不要尝试在代码块中使用SO **
标记。它没有按预期工作,只会造成混乱。
其次,这本书显然已经过时了。回到C语言的旧版本,没有void *
类型,而char *
类型通常用作" generic"指针类型。 fread
的第一个参数是使用char *
类型声明的。出于这个原因,习惯上将实际参数类型的显式强制转换为char *
以避免编译器警告。如果使用旧版本的标准库(声明fread
带char *
参数的标准库),今天甚至可能是必要的。
Modern C标准库使用类型fread
的第一个参数声明void *
。在这种情况下,不需要强制转换,并且转换为char *
毫无意义。