c语言中对文件的操作,解释带问号语句

2024-12-04 01:12:32
推荐回答(1个)
回答1:

看代码中注释

不懂处再追问

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值都不会改变 只有通过返回值才能判断出查找失败