C语言在文件中插入新数据,新数据一直是乱码

大一的,代码基本上打完了,就是插入新数据一直不成功

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 31
typedef struct submit
{
    int num;
    int year,month,day;
    char name[200];
    char address[1000];
    float cash;
} submit;
void TxtToArray(FILE *fp, submit s[])
{
    fp = fopen("8.txt", "r");
    if (fp == NULL) 
    {
        printf("文件打开失败!\n");
        exit(EXIT_FAILURE);
    }
    for(int i=0; i<N-1; i++)
    {
        fscanf(fp,"%d",&s[i].num);
        fscanf(fp,"%d",&s[i].year);
        fscanf(fp,"%d",&s[i].month);
        fscanf(fp,"%d",&s[i].day);
        fscanf(fp,"%s",s[i].name);
        fscanf(fp,"%s",s[i].address);
        fscanf(fp,"%f",&s[i].cash);
    }
    fclose(fp);
    printf("数据读取完成\n");
}
void ArrayToTxt(FILE *fp, submit s[])
{
    fp = fopen("result.txt","w");
    if(fp == NULL) 
    {
        printf("文件打开失败!\n");
        exit(EXIT_FAILURE);
    }
    for(int i=0;i<N;i++)
    {
        fprintf(fp,"%d\t",s[i].num);
        fprintf(fp,"%d\t",s[i].year);
        fprintf(fp,"%d\t",s[i].month);
        fprintf(fp,"%d\t",s[i].day);
        fprintf(fp,"%s\t",s[i].name);
        fprintf(fp,"%s\t",s[i].address);
        fprintf(fp,"%f\n",s[i].cash);
    }
    fclose(fp);
    printf("数据保存完成\n");
}
float MaxArray(submit s[], int n)
{
    float max, min;
    max = min = s[0].cash;
    for(int i=0;i<n;i++)
    {
        if(s[i].cash>max)
        {
            max = s[i].cash;
        }
        if(s[i].cash<min)
        {
            min = s[i].cash;
        }
    }
    printf("最大的差旅费用金额为:%f\n", max);
    printf("最小的差旅费用金额为:%f\n", min);
    return max;
}
void AddNewSubmit(submit s[], int n) 
{
    printf("请输入新数据的编号:");
    scanf("%d", &s[n].num);
    printf("请输入新数据的日期(年 月 日):");
    scanf("%d%d%d", &s[n].year, &s[n].month, &s[n].day);
    printf("请输入新数据的报销人: ");
    scanf("%s", s[n].name);
    printf("请输入新数据的活动地点:");
    scanf("%s", s[n].address);
    printf("请输入新数据的差旅费用金额:");
    scanf("%f", &s[n].cash);
    printf("添加新数据完成!\n");
}
int main()
{
    submit s[N];
    int n = N;
    FILE *fp;
    TxtToArray(fp,s);
    float max = MaxArray(s,n);
    AddNewSubmit(s,n);
    ArrayToTxt(fp,s);
    return 0;
}

文件“8.txt”是下面这个
1 2022 1 20 孟天祥 福建省厦门市思明区莲岳路118号中烟大厦1702室 120
2 2022 1 21 陈祥通 广东省深圳市南山区蛇口港湾大道2号 200
3 2022 1 22 王天宇 上海市闵行区浦星路699号 3000
4 2022 1 23 方文成 上海市浦东新区世纪大道100号上海环球金融中心56楼 300
5 2022 1 24 钱顺卓 海南省海口市琼山区红城湖路22号 100
6 2022 2 1 王海德 辽宁省大连中山区长江路123号大连日航酒店4层清苑厅 29
7 2022 2 2 谢丽秋 四川省成都市城市名人酒店 500
8 2022 2 3 王崇江 山西省大同市南城墙永泰西门 458
9 2022 2 25 黎浩然 陕西省西安市南大街30号中大国际大厦605室 246
10 2022 2 26 关天胜 北京市海淀区知春路113银网中心A座 388
11 2022 2 27 李雅洁 湖北省武汉市经济技术开发区东风大道10号 29
12 2022 2 28 边金双 江苏省扬州市汶河北路42号蓝天大厦 500
13 2022 3 8 王崇江 上海市静安区华山路250号,上海希尔顿酒店 535
14 2022 3 9 李晓梅 安徽省合肥市蜀山经济开发区创业大道3号创业大道3号 638
15 2022 3 10 王天宇 北京市海淀区永嘉北路6号 740
16 2022 3 11 边金双 河北省保定市朝阳南大街2266号 843
17 2022 3 12 王欣荣 天津市武清开发区新源道北18号 945
18 2022 4 13 刘露露 江苏省江阴市新桥镇陶新中路8号 754
19 2022 4 14 徐亚楠 浙江省嘉兴市环城南路393号 828
20 2022 4 15 谢丽秋 贵州省贵阳市云岩区安云路樱花巷20号 902
21 2022 4 16 王炫皓 浙江省苏州市干将西路1296号 976
22 2022 5 26 钱顺卓 海南省海口市琼山区红城湖路22号 246
23 2022 5 27 王崇江 云南省昆明市官渡区拓东路6号 388
24 2022 5 28 黎浩然 广东省深圳市龙岗区坂田 29
25 2022 5 29 刘露露 江西省南昌市西湖区洪城路289号 500
26 2022 5 30 陈祥通 北京市海淀区东北旺西路8号 458
27 2022 5 31 徐志晨 北京市西城区西绒线胡同51号中国会 532
28 2022 6 17 王天宇 北京市海淀区永嘉北路6号 140
29 2022 6 18 边金双 河北省保定市朝阳南大街2266号 200
30 2022 6 19 王欣荣 天津市武清开发区新源道北18号 345

把第91行的n的赋值改为N-1就可以了,因为如果是N,会比文件所有的数据多读一行,然后就出现了异常数据,所以导致程序出错了,改为N-1就可以了。

修改如下:


#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 31
typedef struct submit
{
    int num;
    int year,month,day;
    char name[200];
    char address[1000];
    float cash;
} submit;
void TxtToArray(FILE *fp, submit s[])
{
    fp = fopen("8.txt", "r");
    if (fp == NULL) 
    {
        printf("文件打开失败!\n");
        exit(EXIT_FAILURE);
    }
  //  printf("\n从文件读取的数据为:\n");
    for(int i=0; i<N-1; i++)
    {
        fscanf(fp,"%d",&s[i].num);
        fscanf(fp,"%d",&s[i].year);
        fscanf(fp,"%d",&s[i].month);
        fscanf(fp,"%d",&s[i].day);
        fscanf(fp,"%s",s[i].name);
        fscanf(fp,"%s",s[i].address);
        fscanf(fp,"%f",&s[i].cash);
      //  printf("%d %d %d %d %s %s %f\n",s[i].num,s[i].year,s[i].month,s[i].day,s[i].name,s[i].address,s[i].cash); 
    }
    fclose(fp);
    printf("数据读取完成\n");
}
void ArrayToTxt(FILE *fp, submit s[])
{
    fp = fopen("result.txt","w");
  //  printf("1\n");
    if(fp == NULL) 
    {
        printf("文件打开失败!\n");
        exit(EXIT_FAILURE);
    }
  //  printf("2\n");
 //   printf("\n写入文件的数据为:\n");
    for(int i=0;i<N;i++)
    {
    //    printf("i=%d\n",i);
        fprintf(fp,"%d\t",s[i].num);
        fprintf(fp,"%d\t",s[i].year);
        fprintf(fp,"%d\t",s[i].month);
        fprintf(fp,"%d\t",s[i].day);
        fprintf(fp,"%s\t",s[i].name);
        fprintf(fp,"%s\t",s[i].address);
        fprintf(fp,"%f\n",s[i].cash);
   //     printf("%d %d %d %d %s %s %f\n",s[i].num,s[i].year,s[i].month,s[i].day,s[i].name,s[i].address,s[i].cash); 
    }
  //  printf("3\n");
    fclose(fp);
    printf("数据保存完成\n");
}
float MaxArray(submit s[], int n)
{
    float max, min;
    max = min = s[0].cash;
  //  printf("0,max=%f,min=%f\n",max,min);
    for(int i=0;i<n;i++)
    {
        if(s[i].cash>max)
        {
            max = s[i].cash;
          //  printf("in for ,max=%f\n",max);
            
        }
        if(s[i].cash<min)
        {
            min = s[i].cash;
           // printf("in for , min=%f\n",min);
        }
    }
    printf("最大的差旅费用金额为:%f\n", max);
    printf("最小的差旅费用金额为:%f\n", min);
    return max;
}
void AddNewSubmit(submit s[], int n) 
{
//    printf("A 1\n");
    printf("请输入新数据的编号:");
    scanf("%d", &s[n].num);
    printf("请输入新数据的日期(年 月 日):");
    scanf("%d%d%d", &s[n].year, &s[n].month, &s[n].day);
    printf("请输入新数据的报销人: ");
    scanf("%s", s[n].name);
    printf("请输入新数据的活动地点:");
    scanf("%s", s[n].address);
    printf("请输入新数据的差旅费用金额:");
    scanf("%f", &s[n].cash);
    printf("添加新数据完成!\n");
   // printf("\n新增的数据为;\n");
  //  printf("A 2\n");
  //  printf("%d %d %d %d %s %s %f\n",s[n].num,s[n].year,s[n].month,s[n].day,s[n].name,s[n].address,s[n].cash); 
  //  printf("A 3\n");
}
int main()
{
    submit s[N];
   // 未新增数据前, 文件中只有30行数据,所以这里改为N-1,即只读取30行数据  
    int n = N-1;  
    FILE *fp;
    TxtToArray(fp,s);
    float max = MaxArray(s,n);
    AddNewSubmit(s,n);
    ArrayToTxt(fp,s);
    return 0;
}

8.txt(测试数据文件,和代码放在同一个目录):

1 2022 1 20 孟天祥 福建省厦门市思明区莲岳路118号中烟大厦1702120
2 2022 1 21 陈祥通 广东省深圳市南山区蛇口港湾大道2200
3 2022 1 22 王天宇 上海市闵行区浦星路6993000
4 2022 1 23 方文成 上海市浦东新区世纪大道100号上海环球金融中心56300
5 2022 1 24 钱顺卓 海南省海口市琼山区红城湖路22100
6 2022 2 1 王海德 辽宁省大连中山区长江路123号大连日航酒店4层清苑厅 29
7 2022 2 2 谢丽秋 四川省成都市城市名人酒店 500
8 2022 2 3 王崇江 山西省大同市南城墙永泰西门 458
9 2022 2 25 黎浩然 陕西省西安市南大街30号中大国际大厦605246
10 2022 2 26 关天胜 北京市海淀区知春路113银网中心A座 388
11 2022 2 27 李雅洁 湖北省武汉市经济技术开发区东风大道1029
12 2022 2 28 边金双 江苏省扬州市汶河北路42号蓝天大厦 500
13 2022 3 8 王崇江 上海市静安区华山路250号,上海希尔顿酒店 535
14 2022 3 9 李晓梅 安徽省合肥市蜀山经济开发区创业大道3号创业大道3638
15 2022 3 10 王天宇 北京市海淀区永嘉北路6740
16 2022 3 11 边金双 河北省保定市朝阳南大街2266843
17 2022 3 12 王欣荣 天津市武清开发区新源道北18945
18 2022 4 13 刘露露 江苏省江阴市新桥镇陶新中路8754
19 2022 4 14 徐亚楠 浙江省嘉兴市环城南路393828
20 2022 4 15 谢丽秋 贵州省贵阳市云岩区安云路樱花巷20902
21 2022 4 16 王炫皓 浙江省苏州市干将西路1296976
22 2022 5 26 钱顺卓 海南省海口市琼山区红城湖路22246
23 2022 5 27 王崇江 云南省昆明市官渡区拓东路6388
24 2022 5 28 黎浩然 广东省深圳市龙岗区坂田 29
25 2022 5 29 刘露露 江西省南昌市西湖区洪城路289500
26 2022 5 30 陈祥通 北京市海淀区东北旺西路8458
27 2022 5 31 徐志晨 北京市西城区西绒线胡同51号中国会 532
28 2022 6 17 王天宇 北京市海淀区永嘉北路6140
29 2022 6 18 边金双 河北省保定市朝阳南大街2266200
30 2022 6 19 王欣荣 天津市武清开发区新源道北18345

img

fp = fopen("result.txt","w");
这里应该用a,也就是追加数据