fread执行会让文件内部指针位置移动。但是我的代码出现这样的情况,请经验人士指教

while(fread(ptr,sizeof(structstudent),1,pi)>0){Insert(stu,ptr);fwrite(ptr,sizeof(stru... while(fread(ptr,sizeof(struct student),1,pi)>0){
Insert(stu,ptr);
fwrite(ptr,sizeof(struct student),1,save);
fread(ptr,sizeof(struct student),1,pi);
}
不要质疑,我的代码功能是连续从A读出,连续写入B,一切正常。
问题一、按照ANSI C rationale,fread会让文件内部指针移动count*size个字节,准备后续操作。while里面执行了一次fread,while里面就不应该执行了,避免文件内部指针错位,影响连续读入的效果,但是事实上我的代码是正确的。这是为什么?同样质疑fread是否会移动文件内部指针的代码我的程序里还有。我参考了《C标准库中文版》,里面也说用fread和fwrite时候在存取方面很可能无法准确控制,因为文件存储空间不会准确识别是否被存入数据,《C专家编程>对此没有说明。《C primer 第五版》里面只是一带而过,没有说明。《C语言实战105例》里面有提到对同一个文件连续读写时候中间要使用fseek转换文件状态。可是我的例子是读一个文件同时写另一个文件。是我的程序设计问题还是有什么东西是书上没有提到的?请经验人士指教。

问题二、在文件打开后,如果判断读取时候失败,退出语句块前是否有必要执行fclose一下关闭文件?
展开
 我来答
雪狮天瑞
2012-09-14
知道答主
回答量:60
采纳率:0%
帮助的人:29.2万
展开全部
问题二:fopen成功,必须fclose
问题一:你自己的逻辑问题,不是fread的问题。也就是说你错了不是接口错了。
追问
逻辑错哪里了?如果我改了,同一条记录就会被读两次。
追答
你的代码运行 一次while会读两条记录,铁板钉钉。
你所谓的同一条记录读两次,那是因为你在别处误操作,同一条记录写了两次
intehel
2012-09-14 · TA获得超过1292个赞
知道大有可为答主
回答量:1601
采纳率:100%
帮助的人:1749万
展开全部
第二个fread用来干什么的?
每个成功的fopen都要有对应的fclose
追问
  1. 第二个fread是用来移动文件内部指针的。不然这个代码会同一条记录读两次。

  2. 就是说不需要fclose了?

追答
pi=fopen(...);
if(pi!=NULL)
{
while(fread(ptr,sizeof(struct student),1,pi)>0){
Insert(stu,ptr);
fwrite(ptr,sizeof(struct student),1,save);
}
fclose(pi);
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
hyqhero
2012-09-22 · 超过18用户采纳过TA的回答
知道答主
回答量:77
采纳率:0%
帮助的人:43.7万
展开全部
问题一,不明白你的问题是?
问题二,肯定的关,这是好习惯。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式