看代码中注释
不懂处再追问
int browse(char * key, fpos_t * p, CON * s)
{
FILE * f =0; //定义一个空文件指针 相当于FILE *f=NULL;
int i = 0, r = 0; CON t;
char * a = 0, * b = 0; fpos_t q; //这里是三神渗个变量定义a ,b为字符指针char* 型,并赋值为空(NULL). q为fpos_t型,可以认为是int 无初始化值
if(!s) //判断传入参数 等同于if(s == NULL) 即如果传入的s指针为空 则游颂脊直接返回
return 0;
f = fopen(fileDB, "rb");
if(!f) {
printf("数据库暂无记录\n");
return 0;
}/*end if*/
printf("编号\t姓名\t单位\t电话\t电邮\n");
printf("------------------------------------------------\n");
while(!feof(f)) //判断是否达到文件结尾。 如达到文件结尾(feof(f)=true) 则退出循环 不再读文件
{
fgetpos(f, &q);//获取当前文件偏移 即读取文件到哪个字节了
r 樱雹= fread(&t, sizeof(t), 1, f);//从文件中拂去sizeof(t)个字节数据 并存到变量t中
if(r<1)break;
if(t.name[0]==0)
continue;
if(key)
{
a = strstr(t.name , key);//从t.name中查找是否存在key子串 如果存在 返回key所在的地址,不存在返回NULL
b = strstr(t.tele , key);
if(a == 0 && b == 0) //t.name和t.key中都没有key
continue;
}/*end if*/
if(p) *p = q;
if(s) memcpy(s, &t, sizeof(t));//复制t中的数据到s中。 由于刚进函数时判断过s 所以这里的if(s)是多余的
i++;
show(i, &t);//这个不是系统函数 应该是自定义的。 从命名上看 应该是打印t中数据的值
}/*end while*/
fclose(f);
printf("------------------------------------------------\n");
return i;
}/*end browse*/
综合: 这个函数就是从fileDB中读取数据,并查找每一项 如果在t.name或者t.tel中存在key值(检索关键字)则在参数s中返回查找到的条目,并在参数p中返回该条目所在的偏移量。 该函数返回值为查找到的符合条件的总条目数
存在的问题:如果在fileDB中存在超过一条的符合数据,只会返回最后一条的详细数据
如果没有找到 则p和s值都不会改变 只有通过返回值才能判断出查找失败