大家能帮我看看这个程序如何改正么?感激不尽。(c语言读取文件时段错误)
[code=C/C++][/code]
#include "include/head.h"
/******全局变量********/
const int MAX = 100;
int problem=0; //判断注册问题;
int feo=0;
typedef struct User
{
char name[MAX];
char password[MAX];
}User;
const char *filename="userfile.bin";
FILE* pfile=NULL;
/*****函数声明*******/
void write_user(User* puser,FILE* pfile);
void get_user(User* temp);
void get_name(char* name);
void get_password(char* password);
void text_pass(char* pass,char* pass1);
User* read_user(User* puser,FILE* pfile);
int text_name(char* name);
/**********主函数**********/
int main(void)
{
User member;
static char more ='\0';
printf("您想注册一个新的账户么?(Y or N)\n");
scanf("%c",&more);
getchar(); //吸收换行符;
if(tolower(more)=='n')
{
return false;
}
if(tolower(more)=='y')
{
get_user(&member);
pfile=fopen(filename,"ab+");
write_user(&member,pfile);
fclose(pfile);
}
if(!problem)
{ printf("恭喜您注册成功!\n"); }
return 0;
}
/******从键盘获取用户******/
void get_user(User* temp)
{
char password1[MAX];
printf("请输入您的用户名:\n");
get_name(temp->name);
do
{
text_name(temp->name);
if(problem)
{
printf("错误:该用户名已被注册,请重新注册!\n");
printf("请输入您的用户名:\n");
get_name(temp->name);
}
}
while(problem);
printf("请输入您的密码:\n");
get_password(temp->password);
printf("请确认您的密码:\n");
get_password(password1);
do
{
text_pass(temp->password,password1);
if(problem)
{
printf("错误:请确认两次输入的密码相同!\n");
printf("请输入您的密码:\n");
get_password(temp->password);
printf("请确认您的密码:\n");
get_password(password1);
}
}
while(problem);
return;
}
/****从键盘获取用户名****/
void get_name(char *name)
{
//fflush(stdin); //刷新输入缓冲区,清除回车符,在Windows下才能使用;
fgets(name,MAX,stdin); //已经把回车吞进去了,不用清除了;
size_t len = strlen(name);
if(name[len-1]=='\n')
{ name[len-1]='\0'; }
}
/*****从键盘获取密码******/
void get_password(char *password)
{
//fflush(stdin);
fgets(password,MAX,stdin);
size_t len = strlen(password);
if(password[len-1]=='\n')
{ password[len-1]='\0'; }
}
/*******验证密码是否重复*********/
void text_pass(char *pass,char* pass1)
{
problem=0;
size_t len=strlen(pass);
size_t len1=strlen(pass1);
if(len!=len1)
{
problem=1;
}
if(strcmp(pass,pass1))
{
problem=1;
}
}
/********将用户写入文件*********/
void write_user(User* puser,FILE* pfile)
{
if(!puser)
{
printf("No user object to write to the file.");
return;
}
if(!pfile)
{
printf("No stream pointer for the out file.");
return;
}
size_t len_name=strlen(puser->name);
size_t len_pass=strlen(puser->password);
fwrite(&len_name,sizeof(len_name),1,pfile);
fwrite(puser->name,sizeof(char),len_name,pfile);
fwrite(&len_pass,sizeof(len_pass),1,pfile);
fwrite(puser->password,sizeof(char),len_pass,pfile);
return;
}
/*********从文件中读取用户***********/
User* read_user(User* puser,FILE* pfile)
{
if(!puser)
{
printf("No user object to store data from the file.");
return NULL;
}
if(!pfile)
{
printf("No stream pointer for the input file.");
return NULL;
}
size_t len_name=0;
size_t len_pass=0;
fread(&len_name,sizeof(len_name),1,pfile);
if(feof(pfile))
return NULL;
fread(puser->name,sizeof(char),len_name,pfile); //该处出现段错误;!!!!!!!!!!!!!
puser->name[len_name]='\0';
fread(&len_pass,sizeof(len_pass),1,pfile);
fread(puser->password,sizeof(char),len_pass,pfile);
puser->password[len_pass]='\0';
return puser;
}
/********验证用户名*********/
int text_name(char* name)
{
int index=0;
User* precord;
pfile=fopen(filename,"rb");
if(!pfile)
{
return 0;
}
while(true)
{
read_user(precord,pfile);
if(feof(pfile))
{
fclose(pfile);
return -1;
}
if(!strcmp(name,precord->name))
{
problem=1;
break;
}
++index;
}
fclose(pfile);
return index;
}
总是段错误,是我写入的问题么?写入的读不出来么?
[解决办法]
“fread(puser->name,sizeof(char),len_name,pfile); //该处出现段错误;!!!!!!!!!!!!!
”
在编程中以下几类做法容易导致段错误,基本是是错误地使用指针引起的
访问系统数据区,尤其是往系统保护的内存地址写数据, 最常见就是给一个指针以0地址
内存越界(数组越界,变量类型不一致等) 访问到不属于你的内存区域
用gdb调试下。
参考:
http://hi.baidu.com/netpet/blog/item/65ddae8b7ab716789f2fb422.html