c++的文件操作如何实现删除功能?
比如我写入了一个txt文件,里面包含10个学生的成绩,如果要删除其中学号为1的学生信息后,并重新保存新的文件,我应该怎样操作,求给个思路,能给一个例子就更好了,由于我们是...
比如我写入了一个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();
}
}
} 展开
前面定义了一个结构体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();
}
}
} 展开
6个回答
展开全部
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;
}
其一:使用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) 打开原文件,oldfile
2)创建新文件,newfile
3)从oldfile中读入一个学生情况,如果学号为1则直接读入下一个文件,否则把信息写入到newfile;
4)直到写完。
5)关闭oldfile,newfile
6)删除oldfile
7)改名newfile 到原文件名。
2)创建新文件,newfile
3)从oldfile中读入一个学生情况,如果学号为1则直接读入下一个文件,否则把信息写入到newfile;
4)直到写完。
5)关闭oldfile,newfile
6)删除oldfile
7)改名newfile 到原文件名。
更多追问追答
追问
请问,如何直接读取下一个文件啊,read读取,如果学号为1就continue吗?我实现起来的时候没有删除额,1号学生信息变成其他学生信息了
追答
这个过程不写入就等于删除。
这个过程最大好处就是,可以处理超大的文件。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
找到待删除部分的起始和结束位置(A, B位)
用fseek函数把写指针移动到A 读指针不变
把B以后的数据copy到A后
读完后在写指针后面加上EOF
想法而已,还没有实现……
也不知道能不能实现,操作系统没仔细看过,不知道可不可以同时读写……
好吧,我承认我异想天开了……
用fseek函数把写指针移动到A 读指针不变
把B以后的数据copy到A后
读完后在写指针后面加上EOF
想法而已,还没有实现……
也不知道能不能实现,操作系统没仔细看过,不知道可不可以同时读写……
好吧,我承认我异想天开了……
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
从文件中读出10个学生信息,存储到相应数组里,在数组里删除1号学生信息,把剩下的信息重新写入文件。(附加一句,LS的方法实现不了)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2011-06-10
展开全部
先从文件里读出数据,然后找到学号为1号的学生,删除这些相关的字段,然后从新写入文件中
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询