C语言,怎将文件中指定位置上的数据更新后覆盖???

初学者,求教。我是这样写的,如下,可结果出来是没有将原有数据覆盖,而是额外添加了一项数据。文件中的数据如下:222.0000002.0000002.000000225.0... 初学者,求教。我是这样写的,如下,可结果出来是没有将原有数据覆盖,而是额外添加了一项数据。文件中的数据如下:
2 2 2.000000 2.000000 2.000000
2 2 5.000000 5.000000 5.000000
代码如下:
void fun(student *stu,char *f_name,int id)
{
int i = 0;int j = 0;
FILE *fp;
fp = fopen(f_name,"a");
for(i = 0;i<N;i++)
{
fscanf(fp,"%d %s %f %f %f",&stu->id,stu->name,&stu->grade1,&stu->grade2,&stu->grade3);
if((stu->id) == id)
{
(stu->grade1) = (stu->grade1)+3.0;
(stu->grade2) = (stu->grade2)+3.0;
(stu->grade3) = (stu->grade3)+3.0;
//下列fprintf函数,感觉这里这么写不对,该怎么样写??????
fprintf(fp,"%d %s %f %f %f\n",stu->id,stu->name,stu->grade1,stu->grade2,stu->grade3);
}

}
fclose(fp);

}
展开
 我来答
xoaxa
推荐于2017-12-15 · TA获得超过8611个赞
知道大有可为答主
回答量:6415
采纳率:72%
帮助的人:3499万
展开全部
你需要解决两个问题。
1、待更改的文件应该是以“块”状形式写入的,比如fwrite((void *)student stu,sizeof(student),1L,fp);,只有这样才能准确定位待更改“块”的位置。而以fprintf()写入的文件,可能由于数据的不同,每个结构数据占用的空间就不同,即使你能准确定位,但写入新数据后,若长度短了,剩余的空间可能造成混乱,若长度长了,可能造成”覆盖“。
2、打开文件同时用于”读/写“时,打开的格式是"r+"或”w+“。
另外,还需要搞清楚文件读写指针的使用特点,前两个问题解决后再讨论。
追问
还是不对啊???????也将打开模式改为“w+”了。
这个函数里的参数第一个是不是指:开始写入数据的地址???我将调用的的函数写成这个样子对不对????
fwrite(&stu[i],sizeof(student),1,fp);
追答
我说的是初始文件的写入方式,如果是用fprintf()函数写入的,我就没有办法了。
babywolfh1
2014-01-13 · TA获得超过199个赞
知道答主
回答量:101
采纳率:0%
帮助的人:83.7万
展开全部
方法1, 将数据线写到一个临时文件,在整个数据操作完成后,将临时文件覆盖当前文件
方法2, fprintf之前需要调用fseek进行文件读写指针移位
建议看看文件操作函数的相关介绍,了解一下文件读写指针位置的概念
追问
哦,你这么一说我就有点理解了,fprintf函数是默认从文件头部开始向文件输出的,是这个意思吧。fseek这个函数我理解,就是没用过,文件这块学得不是很透。做的题也少。。。
追答
你使用的a方式打开文件,所以默认是从文件尾部开始写
文件使用方式 意 义
“r” 只读打开一个文本文件,只允许读数据
“w” 只写打开或建立一个文本文件,只允许写数据
“a” 追加打开一个文本文件,并在文件末尾写数据
“rb” 只读打开一个二进制文件,只允许读数据
“wb” 只写打开或建立一个二进制文件,只允许写数据
“ab” 追加打开一个二进制文件,并在文件末尾写数据
“r+” 读写打开一个文本文件,允许读和写
“w+” 读写打开或建立一个文本文件,允许读写
“a+” 读写打开一个文本文件,允许读,或在文件末追加数 据
“rb+” 读写打开一个二进制文件,允许读和写
“wb+” 读写打开或建立一个二进制文件,允许读和写
“ab+” 读写打开一个二进制文件,允许读,或在文件末追加数据
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
nigoole
2014-01-13 · TA获得超过1369个赞
知道小有建树答主
回答量:675
采纳率:71%
帮助的人:452万
展开全部
fp = fopen(f_name,"a");中a是追加的意思,换成fp = fopen(f_name,"w");
追问
我改改过了,可是如果结构体中只有一组数据(就是一个学生)的话,运行结果正确;如果是两个学生的话就会出错。如果是两个学生的话,就将两个都修改覆盖了???两组数据编程一样的了???怎解决啊????
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式