首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

大家能帮小弟我看看这个程序怎么改正么?感激不尽。(c语言读取文件时段异常)

2012-04-28 
大家能帮我看看这个程序如何改正么?感激不尽。(c语言读取文件时段错误)[codeC/C++][/code]#include inclu

大家能帮我看看这个程序如何改正么?感激不尽。(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

热点排行
Bad Request.