大一的,代码基本上打完了,就是插入新数据一直不成功
#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号中烟大厦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
fp = fopen("result.txt","w");
这里应该用a,也就是追加数据