Ocelot
2020-07-19 10:24
部分代码:(主要是这里有问题)
#define USERINFO_FILE "/home/ocelot/pmm/data/info.txt"
//用户信息表记录文档路径
#define SAVES_HOME_PATH "/home/ocelot/pmm/data/"
#define _STRUCT_USER_INFO_SIZE (sizeof(struct user_info))
//struct user_info类型结构体大小
#define _END_LOOP "$!END_0"
extern struct user_info * getUserInfo()
{
FILE *fp = fopen(USERINFO_FILE,"r");
//若文件不存在,则返回空指针
if(fp == NULL)
return NULL;
char buf[64]; //缓冲字符串
int user_num = 0; //用户数量
//获取用户数量
while(fscanf(fp,"%s",buf) != EOF)
{
if(buf[0] == '[')
user_num++;
}
struct user_info *pi = (struct user_info *)malloc(_STRUCT_USER_INFO_SIZE * (user_num+1));
//动态分配结构体数组
fclose(fp);
FILE *fp_s = fopen(USERINFO_FILE,"r");
//若文件不存在,则返回空指针
if(fp == NULL)
return NULL;
int serial = 0; //读入的用户序号
while(fscanf(fp_s,"%s",buf) != EOF)
{
//忽略注释行
if(buf[0] == '#')
continue;
//将Name存入数组
if(buf[0] == '[')
serial++;
if(buf[0] == 'N')
{
printf("##%s##\n",buf);
//指向下一个用户
strcpy(pi->name,//getStrPointStr(buf,':')
buf);
pi+=(_STRUCT_USER_INFO_SIZE * 1);
}
//将Pw存入数组
else if(buf[0] == 'P')
{
sprintf(pi->pw,"%s",getStrPointStr(buf,':'));
}
//忽略其他属性
else
continue;
}
//设定结束标志
pi+=(_STRUCT_USER_INFO_SIZE * 1);
sprintf(pi->name,"%s",_END_LOOP);
sprintf(pi->pw,"%s",_END_LOOP);
pi-=(_STRUCT_USER_INFO_SIZE * serial);
//将结构体指针指向第一个用户
fclose(fp_s);
return pi;
}
输出:
##Name:ocelot##
##Name:whisper##
##Name:xiaoyue##
##Name:xiaoyue##
##Name:xiaoyue##
##Name:xiaoyue##
##Name:xiaoyue##
登录:
用户列表:
[1] 9�ӋU
[2] Name:xiaoyue
[3] Name:xiaoyue
[4] Name:xiaoyue
[5] Name:xiaoyue
[6] Name:xiaoyue
[7]
改了很多次,还是有问题
但用户数量小于等于3个时不会有这种情况,不知道为什么
看判断那儿是不是不对
编码就不对了吧
Linux C语言结构体
118294 学习 · 162 问题
相似问题