二进制文件存取有关问题高分急需

二进制文件存取问题高分急需
C/C++ code

void save(struct tell_list *head)     //存
{
    struct tell_list *p;
    struct tell_list m;
    FILE * fp;
    fp = fopen( "people.dat" , "ab" );
    if( fp == NULL )
    {
        printf("文件打开失败。");
        exit(0);
    }
    p = head ;
    while ( p != NULL )
    {
        m = *p;
        m.next = NULL;
        fwrite( &m , sizeof(struct tell_list) , 1 , fp );
        p = p -> next;
    }
    fclose(fp);
}

/******************************************************************************************************************************/

struct tell_list *read(void)   //取
{
    struct tell_list *head,*p,*q;
    struct tell_list m;
    int size,i,j;
    FILE * fp;
    head = NULL;
    fp = fopen( "people.dat" , "rb" );
    if( fp == NULL)
    {
        printf("文件打开失败。");
        exit(0);
    }
    fseek( fp , 0L , 2 );
    size = ftell(fp);
    j = sizeof(struct tell_list);
    for( i = 1 ; i <= size ;i += j )
    {
        p = (struct tell_list *)malloc(sizeof(struct tell_list));
        if( p == NULL)
        {
            printf("分配空间不足!");
            exit(0);
        }
        fread( &m , sizeof(struct tell_list) , 1 , fp );
        m.next = NULL;
        *p = m;
        p -> next =NULL;
        if( head == NULL )
            head = p;
        else
        {
            q = head;
            while ( q -> next != NULL )
            {
                q = q -> next;
            }
            q -> next = p;
        }
    }
    fclose(fp);
    return (head);
}
存取都是乱码求指点速度阿
这是结构体
C/C++ code

struct tell_list
{    
    int  id;
    char name[11];
    char sex[5];
    int  age;
    char tell[20];
    char address[60];
    char mail[30];
    char relative[20];
    struct tell_list *next;
};


------解决方案--------------------
你使用fseek( fp , 0L , 2 );把指针移动到文件尾求文件的大小,在读内容的时候得记得回复文件的指针到文件头啊。