比如我写入了一个txt文件,里面包含10个学生的成绩,如果要删除其中学号为1的学生信息后,并重新保存新的文件,我应该怎样操作,求给个思路,能给一个例子就更好了,由于我们是初学,谢谢
前面定义了一个结构体worker,里面为职员信息,还定义了一个类pay,里面是函数;
void pay::delete_worker()
{
worker s1;
worker s2;
int n;
cout<<"请输入你要删除的职工号码"<<endl;
cin>>n;
fstream file("worker.dat",ios::in | ios::out);
if(!file){cout<<"error"<<endl;exit(0);}
while(!file.eof())
{
file.read((char *)&s1,sizeof(s1));
if(s1.no==n)
continue;
else
{
s2.no =s1.no;
strcpy(s1.name,s2.name ) ;
s2.jbgz =s1.jbgz ;
s2.bzjt=s1.bzjt;
s2.df=s1.df;
s2.ffyf =s1.ffyf;
s2.jj=s1.jj;
s2.qf=s1.qf ;
s2.sf=s1.sf ;
s2.qtbz=s1.qtbz;
s2.zwgz=s1.zwgz;
s2.yfgz =s1.yfgz ;
s2.sfgz=s1.sfgz;
//s2=s1;
fstream file("worker.dat",ios::in|ios::out);
if(!file){cout<<"error"<<endl;exit(0);}
file.write((char *)&s2,sizeof(s2));
file.close();
}
}
}
请问,如何直接读取下一个文件啊,read读取,如果学号为1就continue吗?我实现起来的时候没有删除额,1号学生信息变成其他学生信息了
追答这个过程不写入就等于删除。
这个过程最大好处就是,可以处理超大的文件。
我知道这原理额,只是如何不写入哇,我编的时候虽然编译通过但是功能没实现
追答贴出你的代码
追问恩,问题我补充到问题里了,因为超过追问字数限制,麻烦你了
追答1)不需要s1 ==> s2 的赋值
2)我的意思是你重新启动一个文件文件名字并不是原文件名。你现在又打开读,有写的很容易弄错,很容易导致整个文件错误。
3)如果你不想用另外一个文件来做,喜欢只用一个文件来做也可以操作,具体策略是:
以可以读写方式打开文件,以变量readIndex,writeindex分别表示要写入的地方,初始都为0
while( 文件没有结束)
{
fseek 到readindex
读入一个记录,
如果该记录不是n,fseek 到writeindex(如果readindex == writeindex可以不写),写入记录;并且writeindex += 记录长度;
否则什么都不用做
readindex += 记录长度;
}