fstream资料修改

fstream文件修改
请教各位一下fstream文件操作的相关问题,FILE相关知识点就免了。
最近在写一个文件加密的小程序,涉及到文件的修改,有几个问题要请教一下各位:
1,我现在能做到的是先只读打开该文件,读取后关闭,再trunc打开重写文件,这样通过字符串修改可以修改文件,但问题来了,一个操作打开两次文件,我同学说这样开销太大了。
2,网上基本搜到的做法都是分读写两次打开的,我现在尝试一次读写打开,直接通过指针位移从头覆盖内容,但现在问题卡在,我进行解码操作后,由于原文比密文长度短,导致有密文尾巴无法覆盖,但我不会单纯的修改。

希望各位分享相关一下经验,谢谢!
------解决方案--------------------
打开文件毕竟次数有限,按照你的第一种方式,主要操作在缓冲区进行,尽量减少读写文件的次数就好了。
------解决方案--------------------
引用:
请问一下trunc方式是什么意思,能举个例子吗?
out模式默认带trunc,就是在写文件时清空原来的所有内容,与之对应的是app,在最后追加

lz的问题,fstream要缩短文件长度好像没有办法吧,记得似乎只能重新打开
或者我不知道,请lx了解的朋友讲解一下
------解决方案--------------------
1、一次打开文件进行读写,是没有问题的
2、把长文件截断为短文件对于fstream还不知道如何操作,FILE是没有问题的


定义person类并实例化对象,将对象的数据信息写入到二进制文件中,然后再读取文件中的信息并显示出来。

#include<iostream>
#include<iomanip>
#include<fstream>
using namespace std;
class person
{
public:
    char name[10];          // 姓名
    char profession[10];    // 职业
    int age;                // 年龄
    double pay;             // 月工资
    person(){}
    person(char *name,char *profession,int age,double pay)
    {
        strcpy(this->name,name);
        strcpy(this->profession,profession);
        this->age=age;
        this->pay=pay;
    }
};
void main()
{
    person lx("刘翔","运动员",28,2132.48);
    person dq("董卿","主持人",38,260000);
    fstream f("d:\\Result.txt",ios::in
------解决方案--------------------
ios::out
------解决方案--------------------
ios::binary);
    if( !f ) return;
    f.write((char*)&lx,sizeof(lx));
    f.write((char*)&dq,sizeof(dq));
    f.seekp(0);
    person p;
    while(true)
    {
        f.read((char *)(&p),sizeof(person));
        if(f.fail())break;
        cout<<setw(10)<<p.name;
        cout<<setw(10)<<p.profession;
        cout<<setw(5)<<p.age;
        cout<<fixed<<setprecision(2)<<setw(14)<<p.pay;
        cout<<endl;
    }
    f.close();
}

------解决方案--------------------
linux    ftruncate
windows   SetEndOfFile
------解决方案--------------------