字符从文件中读取的有关问题

字符从文件中读取的问题
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>


typedef struct info info;
struct info
{
int age;
char name[20];
char cellphone[12];
char qqid[12];
info *next;
};


void get_name (info *current)
{
printf ("请输入联系人姓名:");
fgets (current->name,20,stdin);
int len=strnlen_s (current->name,sizeof (current->name));
if (current->name[len-1]=='\n')
{
current->name[len-1]='\0';
}
}


void get_qqid (info *current)
{
printf ("请输入当前联系人的QQ号码:");
fgets (current->qqid,12,stdin);
int len=strnlen_s (current->qqid,sizeof (current->qqid));
if (current->qqid[len-1]=='\n')
{
current->qqid[len-1]='\0';
}
}


void write_file (FILE *pfile,char *filename,info *first,info *current,info *previous)
{
current=first;

while (current!=NULL)
{
if (fopen_s (&pfile,filename,"wb+"))
{
printf ("打开文件失败");
exit (1);
}

int len=strnlen_s (current->name,sizeof (current->name));
fprintf (pfile,"%4d",len);
fwrite (current->name,sizeof (char),len,pfile);
fwrite (current->cellphone,sizeof (char),11,pfile);
len=strnlen_s (current->qqid,sizeof (current->qqid));
fprintf (pfile,"%d",len);
fwrite (current->qqid,sizeof (char),len,pfile);
fprintf (pfile,"%4d",current->age);
previous=current;
current=current->next;
free (previous);
previous=NULL;
}
first=NULL;
fclose (pfile);
}


void get_person (info *current)
{
get_name (current);
fflush (stdin);
putchar (10);
printf ("请输入当前联系人的年龄:");
scanf_s ("%d",&current->age,sizeof (int));
fflush (stdin);
putchar (10);
printf ("请输入当前联系人的手机号:");
fgets (current->cellphone,12,stdin);
fflush (stdin);
putchar (10);
get_qqid (current);
fflush (stdin);
}


bool find_info (FILE *pfile,char *filename)
{
int len;
int flen;
bool find=false;
info temp;
char temp_name[20];
char cell[12]={'\0'};
char qq[12]={'\0'};
if(fopen_s (&pfile,filename,"rb+"))
{
printf ("打开文件失败。");
exit (1);
}

printf ("请输入要修改联系人的姓名:");
fflush (stdin);
fgets (temp_name,20,stdin);

while (1)
{
fscanf (pfile,"%4d",&len);
fread (temp_name,sizeof (char),len,pfile);
fread (cell,sizeof (char),11,pfile);
fscanf (pfile,"%d",&flen);
fread (qq,sizeof (char),flen,pfile);
fscanf (pfile,"%4d",&temp.age);
if (strcmp (temp_name,temp.name)==0)
{
printf ("联系人已经找到.");
find =true;
break;
}
if (feof (pfile))
{
break;
}
}
return find;
}

int main ()
{
info *first=NULL;
info *current=NULL;
info *previous=NULL;
char buf[100];
char answer='\0';
bool find=false;
FILE *pfile=NULL;
char *filename="info.bin";


 for ( ; ; )
 {
 if (first==NULL)
 {
 printf ("请输入第一个联系人的信息:");
 putchar (10);
 }
 else
 {
 printf ("是否继续输入? y or n :");
 scanf_s ("%c",&answer,sizeof (char));
 fflush (stdin);
 if (tolower (answer)=='n')
 {
 break;
 }
 }

 current=(info*)malloc (sizeof (info));
 if (first==NULL)
 {
 first=current;
 }
 
 if (previous!=NULL)
 {
 previous->next=current;
 }

 get_person (current);
 current->next=NULL;
 previous=current;
}
write_file (pfile,filename,first,current,previous);
find=find_info (pfile,filename);
   system ("pause");
return 0;
}








我用的编译器是visual studio 2010,具体问问题是:在find_info函数中的fscanf (pfile,"%d",&flen);语句出错,flen为一个随机值,这是为什么啊,求解释;
------解决方案--------------------
推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

不要把
fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待

fopen("...","...b");fseek,fread,fwrite,fgetc,fclose  //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待
弄混了

printf里面的%和变量的一一对应关系
scanf里面的%和变量以及变量前加不加&的一一对应关系
是C代码中非常容易出错的地方,而且通常编译还不出错。
所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

在每个最后不带\n的printf后面加fflush(stdout);
在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin);
另外请检查scanf的返回值。