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

自己写的有问题,如下。测试一组数据正确,多加一组就运行不正确。如果可以,尽量在我的基础上改下。也可以粘贴一下你们自己写的。文件学的太浅,不太懂。。。代码如下:voidfu... 自己写的有问题,如下。测试一组数据正确,多加一组就运行不正确。如果可以,尽量在我的基础上改下。也可以粘贴一下你们自己写的。文件学的太浅,不太懂。。。代码如下:void fun(student *stu,char *f_name,int id){ int i = 0;int j = 0; FILE *fp; fp = fopen(f_name,"w+"); 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);}
上边的格式有问题。。。看这个吧。。。
void fun(student *stu,char *f_name,int id)
{
int i = 0;int j = 0;
FILE *fp;
fp = fopen(f_name,"w+");
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);
}
展开
 我来答
瀚漠
推荐于2018-03-21 · 专注C语言发开,Linux系统相关
瀚漠
采纳数:309 获赞数:1288

向TA提问 私信TA
展开全部

你这里的student是结构体吧,这里使用open打开文件:

void fun(student *stu,char *f_name,int id)
{
int i = 0;int j = 0;
int fd;
fd = open(f_name, O_RDWR);
for(i = 0;i<N ;i++)
{
read(fd, stu, sizeof(student));
if((stu->id) == id)
{
(stu->grade1) = (stu->grade1)+3.0;
(stu->grade2) = (stu->grade2)+3.0;
(stu->grade3) = (stu->grade3)+3.0;
//下列fprintf函数,感觉这里这么写不对,该怎么样写??????

lseek(fd, -sizeof(student), SEEK_CUR);
write(fd, stu, sizeof(student));
}

}
close(fd);
}

 方法就是:使用read每次读取一个student结构体,判断id是否相等,如果相等则重新赋值,文件偏移量后退sizeof(student)大小,写入新结构体即可。


read读文件时,文件偏移是随时更新的,所以要从当前位置后退一个结构体大小。


lseek的用法:

off_t lseek(int handle, off_t offset, int fromwhere);

handel:文件描述符,open的返回值

offset:偏移大小,正数向后偏移,负数向前偏移

fromwhere:偏移的起始点,系统变量:SEEK_CUR(当前)、SEEK_SET(文件头)、SEEK_END(文件尾)


当然用fseek也可以,这里我就不写了,对应的是:

fopen、fread、fwrite、fseek

本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2014-01-13
展开全部
我只是做任务
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wangkuanmin
2014-01-13
知道答主
回答量:12
采纳率:0%
帮助的人:4.2万
展开全部
更新后覆盖???
是修改吗?
你可以查一下调整文件内部指针的函数,然后调用相关文件函数往里面覆盖
追问
是的,就是修改。举个例子,就是通过id找到这个student,将这个student的信息修改了,就OK了。帮忙啊,现在是头都大了。文件学的不是很懂,就会几个基本的函数
追答
你百度“文件内部指针函数”就会找到好多,我就不详细说了,像上面说的lseek也都是里面的一种
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 3条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式