求助 C语言中如何往txt文件增加数据

leoJD 2017-06-13 11:59:28
#include "stdio.h"
#include "string.h"
#include "math.h"
#include "stdlib.h"
int size=0;
struct GZ
{long int num;
char name[20];
float jbgz;
float jt;
float ks;
float sfgz;
};

struct GZ s[100];

void Input()
{
FILE *fp;
int n=0;
fp=fopen("e:\\1.txt","r");
while(fscanf(fp,"%ld %s %f %f\n",&s[n].num,s[n].name,&s[n].jbgz,&s[n].jt)!=EOF)
{
n++;
}
fclose(fp);
size=n;
}

void Disp()
{
int n;

printf("\t\t\tNum Name jbgz jt ks sfgz \n");
for(n=0;n<size;n++)
{
printf("\t\t\t%-5ld%-10s%-7.2f%-7.2f%-7.2f%-7.2f\n",s[n].num,s[n].name,s[n].jbgz,s[n].jt,s[n].ks,s[n].sfgz);
printf("\n");
}
}


void Count()/*计算实发工资*/
{
float c,k,a,b;
int n;
for(n=0;n<size;n++)
{
a=s[n].jbgz ;
b=s[n].jt ;
c=a+b;
if(c<=1500) k=0;
else if(c<=2000) k=(float)((c -1500)*0.05);
else if(c>2000) k=(float)((c -1500)*0.05+(c -2000)*0.1);
s[n].sfgz =c-k ;
s[n].ks =k;
printf("\t\t\t%-5ld %-10s %-7.2f %-7.2f %-7.2f %-7.2f\n",s[n].num,s[n].name,s[n].jbgz,s[n].jt,s[n].ks,s[n].sfgz);
printf("\n");
}
}


void Append()/*追加1条职工信息*/
{
int a;
FILE *fp;
printf("please input the people's information that you want to append.\n");
a=size;
fp=fopen("e:\\1.txt","a");
printf("\t\t\tplease re-input the Num Name jbgz jt.\n");
scanf("%ld %s %f %f",&s[a].num,s[a].name,&s[a].jbgz,&s[a].jt);

fwrite(&s[a],sizeof(GZ),1,fp);
fclose(fp);

}


void Modify()/*修改数据*/
{
int a,b,i;
FILE *fp;
printf("please input the people's id number that you want to change.\n");
scanf("%d",&a);
a=a-201700;
if(a>size) printf("sorry the people not exist.\n");
else
{
b=a-1;
fp=fopen("e:\\1.txt","a");
printf("\t\t\tplease re-input the Num Name jbgz jt.\n");
scanf("%ld %s %f %f",&s[b].num,s[b].name,&s[b].jbgz,&s[b].jt);
fseek(fp,i*sizeof(GZ),2);
fwrite(&s[b],sizeof(GZ),1,fp);
fclose(fp);
}

}

void Query()/*查询职工信息*/
{
int a;
printf("please input the people's information that you want to change.\n");
scanf("%d",&a);
a=a-201700;
if(a>size) printf("sorry the people not exist.\n");
else
{
FILE *fp;
float c,k,h,b;
int m=0,n;
printf("\t\t\tNum Name jbgz jt ks sfgz \n");
for(n=0;n<size;n++)
{
h=s[n].jbgz ;
b=s[n].jt ;
c=h+b;
if(c<=1500) k=0;
else if(c<=2000) k=(float)((c -1500)*0.05);
else if(c>2000) k=(float)((c -1500)*0.05+(c -2000)*0.1);
s[n].sfgz =c-k ;
s[n].ks =k;
}
printf("\t\t\t%-5ld %-10s %-7.2f %-7.2f %-7.2f %-7.2f\n",s[a].num,s[a].name,s[a].jbgz,s[a].jt,s[a].ks,s[a].sfgz);
printf("\n");
}
}


void main()
{
int choice;
menu:printf("\t\t\t1.Input employee's information\n");
printf("\t\t\t2.Display employee's information\n");
printf("\t\t\t3.Count\n");
printf("\t\t\t4.Append a employee information\n");
printf("\t\t\t5.Query a employee information\n");
printf("\t\t\t6.Modify employee's intformation\n");
printf("\t\t\t0.Exit system\n\n");
printf("\t\t\tPlease enter choice(0~7)");
scanf("%d",&choice);
switch(choice)
{
case 1:Input();break;
case 2:Disp();break;
case 3:Count();break;
case 4:Append();break;
case 5:Query();break;
case 6:Modify();break;
case 0:exit(0);
}
if(choice<0||choice>6)printf("\n\n\n\t\tplease choose again!\n\n");
goto menu;
}

请问这中间的modify和append应如何编写,谢谢
...全文
1003 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
leoJD 2017-06-14
  • 打赏
  • 举报
回复
引用 9 楼 cfjtaishan 的回复:
[quote=引用 6 楼 leoJD 的回复:] [quote=引用 3 楼 cfjtaishan 的回复:] 对于修改,对于普通文件还没有什么捷径直接修改文件里的某行数据,甚至是某个数据(要做到这些,需要专门的软件),只能是将所有数据读出来,在内存里修改,然后在重新写入文件中; 对于增加数据,如果是在文件末尾增加,可以在打开文件时,以追加的形式打开;若在某行数据之后增加,也只能读到内存里,然后在增加。
我在运行这个程序的时候 用修改再重新输出就是修改后的 但如果重新运行的时候 就不对了,txt文件里也会出现乱码,这要如何解决啊 谢谢[/quote] 看到你的写入用fwrite,但是读取用fscanf,读和写的函数不匹配呢。fscanf是格式化的,一个元素一个元素读取,而fwrite是整个结构体进行写的,建议若用fwrite写,那么就要用fread读吧;注意读写函数要匹配[/quote]好的 谢谢了
自信男孩 2017-06-14
  • 打赏
  • 举报
回复
对于修改,对于普通文件还没有什么捷径直接修改文件里的某行数据,甚至是某个数据(要做到这些,需要专门的软件),只能是将所有数据读出来,在内存里修改,然后在重新写入文件中; 对于增加数据,如果是在文件末尾增加,可以在打开文件时,以追加的形式打开;若在某行数据之后增加,也只能读到内存里,然后在增加。
  • 打赏
  • 举报
回复
建议用数据库做这类题目,数据不多可以用access之类的小型DB。 往文件追加数据可以以"a"方式打开文件,然后中fwrite.
自信男孩 2017-06-14
  • 打赏
  • 举报
回复
引用 6 楼 leoJD 的回复:
[quote=引用 3 楼 cfjtaishan 的回复:] 对于修改,对于普通文件还没有什么捷径直接修改文件里的某行数据,甚至是某个数据(要做到这些,需要专门的软件),只能是将所有数据读出来,在内存里修改,然后在重新写入文件中; 对于增加数据,如果是在文件末尾增加,可以在打开文件时,以追加的形式打开;若在某行数据之后增加,也只能读到内存里,然后在增加。
我在运行这个程序的时候 用修改再重新输出就是修改后的 但如果重新运行的时候 就不对了,txt文件里也会出现乱码,这要如何解决啊 谢谢[/quote] 看到你的写入用fwrite,但是读取用fscanf,读和写的函数不匹配呢。fscanf是格式化的,一个元素一个元素读取,而fwrite是整个结构体进行写的,建议若用fwrite写,那么就要用fread读吧;注意读写函数要匹配
leoJD 2017-06-14
  • 打赏
  • 举报
回复
引用 7 楼 libing403 的回复:
关于c语言对文件的操作,以及输入输出,你可以参考一下这个资料 http://blog.csdn.net/libing403
哦 好的谢谢!
「已注销」 2017-06-14
  • 打赏
  • 举报
回复
关于c语言对文件的操作,以及输入输出,你可以参考一下这个资料 http://blog.csdn.net/libing403
leoJD 2017-06-14
  • 打赏
  • 举报
回复
引用 3 楼 cfjtaishan 的回复:
对于修改,对于普通文件还没有什么捷径直接修改文件里的某行数据,甚至是某个数据(要做到这些,需要专门的软件),只能是将所有数据读出来,在内存里修改,然后在重新写入文件中; 对于增加数据,如果是在文件末尾增加,可以在打开文件时,以追加的形式打开;若在某行数据之后增加,也只能读到内存里,然后在增加。
我在运行这个程序的时候 用修改再重新输出就是修改后的 但如果重新运行的时候 就不对了,txt文件里也会出现乱码,这要如何解决啊 谢谢
leoJD 2017-06-14
  • 打赏
  • 举报
回复
引用 2 楼 js_gary 的回复:
建议用数据库做这类题目,数据不多可以用access之类的小型DB。 往文件追加数据可以以"a"方式打开文件,然后中fwrite.
谢了但目前只学了C
leoJD 2017-06-14
  • 打赏
  • 举报
回复
引用 1 楼 jianwen0529 的回复:
fp=fopen("e:\\1.txt","a") //a 模式是追加写入,不清楚内容并且从最后位置写入数据
谢谢
幻夢之葉 2017-06-14
  • 打赏
  • 举报
回复
fp=fopen("e:\\1.txt","a") //a 模式是追加写入,不清楚内容并且从最后位置写入数据

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧