c++的文件操作如何实现删除功能?

比如我写入了一个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();
}
}
}

c++语言本身是不能删除文件或文件夹的,他们是windows操作系统里的东西,所以得借助其api函数。
其一:使用shell 接口:
void FileDelete(CString directory)
{
SHFILEOPSTRUCT shFileOp;
char strCurrentPath[MAX_PATH];
memset(&shFileOp,0,sizeof(shFileOp));

GetCurrentDirectory(MAX_PATH,strCurrentPath);
strcat_s(strCurrentPath,sizeof(strCurrentPath),directory);
strCurrentPath[strlen(strCurrentPath)+1] = 0;
shFileOp.wFunc = FO_DELETE;
shFileOp.pFrom = strCurrentPath;
shFileOp.pTo = NULL;
shFileOp.fFlags = FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR;
SHFileOperation(&shFileOp);
}
使用该函数你得 #include<Shlwapi.h> #pragma comment(lib,"Shlwapi.lib") 使用他可以将directory和其下的所有文件静默删除,听说在删除共享文件夹的时候会出错或提示,没试过。不过我使用system()做删除的时候共享文件夹下的删除是会出错的。
其二: 使用MFC的CFileFind递归遍历文件并删除文件和文件夹
bool DeleteDirectory(char* strDirName)
{
CFileFind tempFind;

char strTempFileFind[MAX_PATH];
sprintf(strTempFileFind,"%s//*.*", strDirName);
BOOL IsFinded = tempFind.FindFile(strTempFileFind);
while (IsFinded)
{
IsFinded = tempFind.FindNextFile();
if (!tempFind.IsDots())
{
char strFoundFileName[MAX_PATH];
strcpy(strFoundFileName, tempFind.GetFileName().GetBuffer(MAX_PATH));
if (tempFind.IsDirectory())
{
char strTempDir[MAX_PATH];
sprintf(strTempDir,"%s//%s", strDirName, strFoundFileName);
DeleteDirectory(strTempDir);
}
else
{
char strTempFileName[MAX_PATH];
sprintf(strTempFileName,"%s//%s", strDirName, strFoundFileName);
DeleteFile(sTempFileName);
}
}
}
tempFind.Close();
if(!RemoveDirectory(strDirName))
{
return FALSE;
}
return TRUE;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-09-20
1) 打开原文件,oldfile
2)创建新文件,newfile
3)从oldfile中读入一个学生情况,如果学号为1则直接读入下一个文件,否则把信息写入到newfile;
4)直到写完。
5)关闭oldfile,newfile
6)删除oldfile
7)改名newfile 到原文件名。追问

请问,如何直接读取下一个文件啊,read读取,如果学号为1就continue吗?我实现起来的时候没有删除额,1号学生信息变成其他学生信息了

追答

这个过程不写入就等于删除。

这个过程最大好处就是,可以处理超大的文件。

追问

我知道这原理额,只是如何不写入哇,我编的时候虽然编译通过但是功能没实现

追答

贴出你的代码

追问

恩,问题我补充到问题里了,因为超过追问字数限制,麻烦你了

追答

1)不需要s1 ==> s2 的赋值
2)我的意思是你重新启动一个文件文件名字并不是原文件名。你现在又打开读,有写的很容易弄错,很容易导致整个文件错误。
3)如果你不想用另外一个文件来做,喜欢只用一个文件来做也可以操作,具体策略是:
以可以读写方式打开文件,以变量readIndex,writeindex分别表示要写入的地方,初始都为0
while( 文件没有结束)
{
fseek 到readindex
读入一个记录,
如果该记录不是n,fseek 到writeindex(如果readindex == writeindex可以不写),写入记录;并且writeindex += 记录长度;
否则什么都不用做
readindex += 记录长度;
}

本回答被提问者采纳
第2个回答  2011-06-11
找到待删除部分的起始和结束位置(A, B位)
用fseek函数把写指针移动到A 读指针不变
把B以后的数据copy到A后
读完后在写指针后面加上EOF

想法而已,还没有实现……

也不知道能不能实现,操作系统没仔细看过,不知道可不可以同时读写……

好吧,我承认我异想天开了……
第3个回答  2011-06-10
从文件中读出10个学生信息,存储到相应数组里,在数组里删除1号学生信息,把剩下的信息重新写入文件。(附加一句,LS的方法实现不了)
第4个回答  2011-06-10
先从文件里读出数据,然后找到学号为1号的学生,删除这些相关的字段,然后从新写入文件中
相似回答