void do_logout(const char *buf,int sockfd)
{
FILE *fp;
const char *t;
struct login_user me;
struct login_user logoutuser;
fp = fopen("login.dat","r+");
if (fp == NULL) {
err_ret("failed to open the login.dat");
return;
}
else {
t = logout_name(buf,"& :\t\n");
// printf("logout name is %s\n",t);
strcpy(me.name,t);
while (fread(&logoutuser,sizeof(struct login_user),1,fp) == 1) {
fprintf(stderr,"Find user once login\n");
if (strcmp(me.name,logoutuser.name) == 0) {
if (!logoutuser.online) {
fprintf(stderr,"user is already offline\n");
return;
}
else {
fprintf(stderr,"I will chang the user to offline\n");
logoutuser.online = false;
off_t offset;
offset = -sizeof(struct login_user);
// printf("offset is %d\n",offset);
if (fseek(fp,offset,SEEK_CUR) != 0) {
err_ret("seek error");
return;
}
if (fwrite(&logoutuser,sizeof(struct login_user),1,fp) != 1) {
err_ret("fwrite error");
return;
}
fflush(fp);
return;
if (fp != NULL) {
fclose(fp);
}
}
}
}
fprintf(stderr,"user is not in\n");
}
{
FILE *fp;
const char *t;
struct login_user me;
struct login_user logoutuser;
fp = fopen("login.dat","r+");
if (fp == NULL) {
err_ret("failed to open the login.dat");
return;
}
else {
t = logout_name(buf,"& :\t\n");
// printf("logout name is %s\n",t);
strcpy(me.name,t);
while (fread(&logoutuser,sizeof(struct login_user),1,fp) == 1) {
fprintf(stderr,"Find user once login\n");
if (strcmp(me.name,logoutuser.name) == 0) {
if (!logoutuser.online) {
fprintf(stderr,"user is already offline\n");
return;
}
else {
fprintf(stderr,"I will chang the user to offline\n");
logoutuser.online = false;
off_t offset;
offset = -sizeof(struct login_user);
// printf("offset is %d\n",offset);
if (fseek(fp,offset,SEEK_CUR) != 0) {
err_ret("seek error");
return;
}
if (fwrite(&logoutuser,sizeof(struct login_user),1,fp) != 1) {
err_ret("fwrite error");
return;
}
fflush(fp);
return;
if (fp != NULL) {
fclose(fp);
}
}
}
}
fprintf(stderr,"user is not in\n");
}
}
特别注意的是fflush()函数,要是不立即将其写到磁盘上,等会另外用户登录就不会读到这些数据,除非系统自动冲洗了