赞
踩
最近在学习QT,想做个图形化界面的学生管理系统来检验下学习成果,在实现删除功能时遇到了问题。
如:我想删除一个学生,输入学号后,如何删除文件中对应学号学生的信息?
或:我想更改一个学生的信息,输入学号后,如何更改文件中对应学号学生的一些信息
信息在文件中的存储格式如图
可以先将整个文件的内容通过readline()
读进一个名为stu_line 的QStringList
中,
然后遍历该stu_line,找到目标学生的所有内容,保存在一个字符串 subs中,
这时再次遍历stu_line并进行重写文件,每次判断当前获取到的字符串内容是否等于subs
若等于,continue就行。
这里展示一下代码
void del_stu::del(QString subs)//subs为目标学生内容,即要删除的对象 { //覆盖到原文件中 QFile f("stu.txt"); if (!f.open(QIODevice::WriteOnly | QIODevice::Text)) { QMessageBox::critical(this,"错误","文件打开失败!信息未保存!"); return; } for(int i=0;i<stu_lines.size();i++) { QString temp=stu_lines[i].trimmed();//trimmed()用去去除前后的空格 //以防万一 //如果不用应该也没关系 if(temp==subs) continue;//跳过需要删除的学生信息 QTextStream out(&f); out<<stu_lines[i]; out<<"\n"; } f.close(); return; }
可能有人会问我怎么才能得到目标学生的所有内容
这里解释一下:
首先,遍历stu_line,同时将每次从QStringList中获取到的元素保存到字符串 Line中, 再将line通过空格分割(这里使用split()
函数)并保存在一个另一个QStringList temp中,然后就可以通过下标得到每个学生的学号与目标学号进行判断(因为我的文件中学号是第二个元素,所以我可以用temp[1]来获取学号),若相同,则返回Line。
这里贴上代码
QString del_stu::find_from_files(QString cnt) //cnt为目标学号 { read_from_flie();//将文件读入程序,存放在stu_line中 int i=0; int size=stu_lines.size(); for(i=0;i<size;i++) { QString line=stu_lines[i].trimmed(); if(line=="")continue;//这里包含一个QStringList的out of range问题 //怕读取时行与行间有空隙,若为空就下一遍循环。 QStringList subs=line.split(' '); if(subs[1]==cnt)//等于目标学号时,返回该生全部内容 { return line; } } return "没找到"; }
更改信息的话步骤也一样,可以将本来要跳过的line经过相应处理放回去,再覆盖文件就ok了。
有帮助的点个赞呗
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。