发布网友 发布时间:2022-05-31 16:50
共1个回答
热心网友 时间:2023-10-20 01:27
你这里的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