C语言怎么对已写入文件中的数据加以修改

求教: C语言如何对已写入文件中的数据加以修改?
       我想思路应该是,写入->读取->修改->再写入。但实现不知怎样做。我试了一下,但不行。麻烦看看问题何在。
//change data written in a file

#include <stdio.h>
#include <stdlib.h>

#define SIZE 41
#define MAX  81

struct person{
    char name[SIZE];
    unsigned short age;
    char address[MAX];
    char job[SIZE];
};

int main(void)
{
    struct person info;
    struct person rec;
    struct person turnout;
    FILE * fp;
    long fl;

    if((fp = fopen("info.dat","wb")) == NULL)
    {
        fprintf(stderr, "Error opening %s", "info.dat");
        exit(EXIT_FAILURE);
    }
    printf("Name: ");
    fgets(info.name, SIZE, stdin);
    printf("\nAge: ");
    scanf("%u", &info.age);
    getchar();
    printf("\nAddress: ");
    fgets(info.address, SIZE, stdin);
    printf("\nJob: ");
    fgets(info.job, SIZE, stdin);
    fwrite(&info, sizeof (struct person), 1, fp);
    puts("\nOriginally:");
    printf("Name: %s", info.name);
    printf("\nAge: %u",info.age);
    printf("\nAddress: %s", info.address);
    printf("\nJob: %s", info.job);
    fl = ftell(fp);
    fseek(fp, fl-(long)sizeof(struct person), SEEK_CUR);
    fread(&rec, sizeof (struct person), 1, fp);
    puts("Rec:");
    puts("\nNow:");
    printf("Name: %s", rec.name);
    printf("\nAge: %u",rec.age);
    printf("\nAddress: %s", rec.address);
    printf("\nJob: %s", rec.job);
    printf("\nName: ");
    fgets(rec.name, SIZE, stdin);
    printf("\nAge: ");
    scanf("%u", &rec.age);
    getchar();
    printf("\nAddress: ");
    fgets(rec.address, SIZE, stdin);
    printf("\nJob: ");
    fgets(rec.job, SIZE, stdin);
    fl = ftell(fp);
    fseek(fp, fl-(long)sizeof(struct person), SEEK_CUR);
    fwrite(&rec, sizeof (struct person), 1, fp);
    fseek(fp, -(long)sizeof(struct person), SEEK_CUR);
    fread(&turnout, sizeof (struct person), 1, fp);
    puts("\nNow:");
    printf("Name: %s", turnout.name);
    printf("\nAge: %u",turnout.age);
    printf("\nAddress: %s", turnout.address);
    printf("\nJob: %s", turnout.job);

    fclose(fp);

    return 0;
}
C 文件 数据

------解决方案--------------------

  if((fp = fopen("info.dat","wb")) == NULL)
//改成,
  if((fp = fopen("info.dat","wb+")) == NULL)

// 建议检查每个函数的返回值!

------解决方案--------------------
unsigned int age;

scanf("%u", &info.age);
要是定义short  会报警告的

 fwrite(&info, sizeof (struct person), 1, fp);
这个不支持直接写结构体吧 你不可以写4句吗 一个一个写进去 这句话有问题
------解决方案--------------------
内存对齐造成的 
详情请看
http://bbs.****.net/topics/390209790
------解决方案--------------------
google, 看看别人如何操作文件的
------解决方案--------------------
所谓修改删除文件a某位置的内容,其实是读打开文件a,再将‘a中修改删除位置之前的内容+修改删除的内容+a中修改删除位置之后的内容’保存到文件b,关闭文件a,删除文件a,将文件b改名为与之前文件a相同的名字,仅此而已。