fstream资料修改
fstream文件修改
请教各位一下fstream文件操作的相关问题,FILE相关知识点就免了。
最近在写一个文件加密的小程序,涉及到文件的修改,有几个问题要请教一下各位:
1,我现在能做到的是先只读打开该文件,读取后关闭,再trunc打开重写文件,这样通过字符串修改可以修改文件,但问题来了,一个操作打开两次文件,我同学说这样开销太大了。
2,网上基本搜到的做法都是分读写两次打开的,我现在尝试一次读写打开,直接通过指针位移从头覆盖内容,但现在问题卡在,我进行解码操作后,由于原文比密文长度短,导致有密文尾巴无法覆盖,但我不会单纯的修改。
希望各位分享相关一下经验,谢谢!
------解决方案--------------------
打开文件毕竟次数有限,按照你的第一种方式,主要操作在缓冲区进行,尽量减少读写文件的次数就好了。
------解决方案--------------------
out模式默认带trunc,就是在写文件时清空原来的所有内容,与之对应的是app,在最后追加
lz的问题,fstream要缩短文件长度好像没有办法吧,记得似乎只能重新打开
或者我不知道,请lx了解的朋友讲解一下
------解决方案--------------------
1、一次打开文件进行读写,是没有问题的
2、把长文件截断为短文件对于fstream还不知道如何操作,FILE是没有问题的
------解决方案--------------------
linux ftruncate
windows SetEndOfFile
------解决方案--------------------
请教各位一下fstream文件操作的相关问题,FILE相关知识点就免了。
最近在写一个文件加密的小程序,涉及到文件的修改,有几个问题要请教一下各位:
1,我现在能做到的是先只读打开该文件,读取后关闭,再trunc打开重写文件,这样通过字符串修改可以修改文件,但问题来了,一个操作打开两次文件,我同学说这样开销太大了。
2,网上基本搜到的做法都是分读写两次打开的,我现在尝试一次读写打开,直接通过指针位移从头覆盖内容,但现在问题卡在,我进行解码操作后,由于原文比密文长度短,导致有密文尾巴无法覆盖,但我不会单纯的修改。
希望各位分享相关一下经验,谢谢!
------解决方案--------------------
打开文件毕竟次数有限,按照你的第一种方式,主要操作在缓冲区进行,尽量减少读写文件的次数就好了。
------解决方案--------------------
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
------解决方案--------------------