在用for循环写入文件流,再用write()写入时,内容出错。为何不能在当前位置前写入记录

YUSHUIHE 2016-11-21 09:29:08
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
//(a)设置文件指针指向第1个文件记录的函数
void rewind3(fstream&f) //倒回
{
f.clear();
f.seekg(0,ios::beg);
}
//(b)返回其记录大小为recSize字节的文件大小。在函数调用后文件指针不改变
int fileSize(fstream& f,int recSize)
{
unsigned int i,j=f.tellg();
f.seekg(0,ios::end);
i=f.tellg()/recSize;
f.seekg(-(int)j,ios::end);
return i;
}
//(c)将obj写到文件指针当前值之前的记录
template<typename T>
void updata(fstream& f,const T& obj)
{
if(f.tellp()>=sizeof(T))
{
f.seekp(-(int)sizeof(T),ios::cur);
}
f.write((char*)&obj,sizeof(T));
}
//(d)在文件尾增加v的内容
template<typename T>
void append(fstream& f,const vector<T>& v)
{
f.seekp(0,ios::end);
f.write((char*)&v,sizeof(T)); //不能丢掉(char*)&
}

int main()
{
int arr[]={5,8,2,12,3,78,52,67,98};
int arrSize=sizeof(arr)/sizeof(int);
fstream f;
f.open("shuzu.dat",ios::in|ios::out|ios::trunc|ios::binary);
if(!f)
{
cerr<<"文件shuxu.dat没有打开"<<endl;
return 1;//等同于exit(-1);
}
rewind3(f); //文件指针指向文件首
for(int i=0;i<arrSize;i++)
{
f.write((char*)&arr[i],sizeof(int));
}
f.write((char*)&arr[0],sizeof(int)); //再在文件后写入一个记录。能写入,但写入的是一个很大的负数
f.seekp(-(int)sizeof(int)*3,ios::end);
updata(f,arr[0]); // 在当前记录前写入。不能写入
cout<<"文件记录数为:"<<fileSize(f,sizeof(int))<<endl;
f.seekg(0,ios::end);
int i,binSize=f.tellg()/sizeof(int);
for(i=0;i<binSize;i++)
{
f.read((char*)&arr[i],sizeof(int));
cout<<arr[i]<<" ";
}
cout<<endl;
return 0;
}
此程序编译能通过,运行也成功,但运行结果不正确,即在利用for循环写入后,再用write()写入,能写入,但输出时内容是一个很大的负数(-858993460)。在用自编的函数updata()在当前指针位置前写入记录,不成功,文件相应位置的内容不改变,好像未执行此函数。这是为什么?请高师指点,谢谢。
...全文
355 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
YUSHUIHE 2016-11-29
  • 打赏
  • 举报
回复
YUSHUIHE 2016-11-27
  • 打赏
  • 举报
回复
3楼老师说得的太对了。确实是丢掉了该语句。谢谢。
  • 打赏
  • 举报
回复
for(i=0;i<binSize;i++)前加入 f.seekp(0,ios::beg);就可以了
小灸舞 2016-11-22
  • 打赏
  • 举报
回复
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。
paschen 版主 2016-11-21
  • 打赏
  • 举报
回复
单步跟踪程序运行,观察每一步变量变化情况,观察你写入的值是什么,分析原因
访问真八字排盘系统介绍: 1、八字排盘 八字排盘是将年月日按照天干地支的形式进行排列,一个间单位代表了一个柱。八字由年柱、月柱、日柱和柱共四个柱组成,也被称为四柱八字。八字学中基于中国阴阳五行、天干地支与刑冲克害、以及民间盲派的神煞论等方式,进一步预测爱情顺遂、工作高低、姻缘好坏、财富高低、学业成就、身体健康等事的学问。 八字排盘由以下元素组合:年月日四柱、大运干支、胎元 、年干支、十神、地势、神煞等。生辰八字不只是把干支历计算出来,而还要遵守月令、节令的强弱,辰的阴阳变化进行校正。排盘分析,就是根据出生者的性别、天干地支的阴阳五行关系、进一步推算出来的一套方法论,给预测者做人生吉凶的参考数据,在未来事业、财运、婚姻、家庭等问题,能做出风险较低的决策。 八字排盘怎么看 八字排盘由年、月、日、四柱组成,每柱包含一个天干和一个地支,共八个字。年柱代表出生的年份,月柱代表出生的月份,日柱代表出生的日期,柱则代表出生的辰。每个柱的干支组合都会对个人的命运产生影响。天干地支旁边标注的正财、偏财、偏印、正印、比肩、劫财、食神、伤官、正官、七杀等,称为十神。 2、八字排盘软件介绍 我们是腾讯云市场金牌合作伙伴,广州正规软件开发公司,开发的八字排盘系统数据最全面精准,我们八字排盘采用最精确的排盘程序,而且运用“真太阳”,进行更精确的间划分。大家都知道我们使用的北京间,是统一规定的标准间。而八字排盘需要相对于太阳方位的天文间,即平太阳。我们国家地大物博,北京间19,哈尔滨已经夜幕降临,而新疆却还是太阳高挂,这哈尔滨的天文间可能在20:00以后,而新疆的天文间可能在16。北京间是东经120度经线的平太阳,如果您出生地的经度与北京间所处的经度差异较大,或者处于单数间点的后,比如6点差一刻,8点,10点15分等

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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