在用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()在当前指针位置前写入记录,不成功,文件相应位置的内容不改变,好像未执行此函数。这是为什么?请高师指点,谢谢。
...全文
344 5 打赏 收藏 转发到动态 举报
写回复
用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
  • 打赏
  • 举报
回复
单步跟踪程序运行,观察每一步变量变化情况,观察你写入的值是什么,分析原因

64,662

社区成员

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

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