c读取txt文件内容并建立一个链表_C++链表实现学生信息管理系统
生活随笔
收集整理的這篇文章主要介紹了
c读取txt文件内容并建立一个链表_C++链表实现学生信息管理系统
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
可以增刪查改,使用鏈表存儲(chǔ),支持排序以及文件存儲(chǔ)及數(shù)據(jù)讀取,基本可以應(yīng)付期末大作業(yè)(狗頭) 界面為
源代碼為一個(gè)main.cpp和三個(gè)頭文件,具體為 main.cpp
#include <iostream> #include <fstream>//文件操作 #include <sstream>//int轉(zhuǎn)string #include <iomanip>//cout格式化輸出 setw() #include <stdlib.h> #include "student.h" #include "node.h" #include "list.h" using namespace std;int main()//入口函數(shù) {//test();CList list1;//創(chuàng)建鏈表對(duì)象Read4File(list1);//將文件數(shù)據(jù)讀取到鏈表中int choice = -1;//接收用戶(hù)選擇while(true){system("cls");//清屏MainMenu();cin>>choice;switch(choice){case 1:system("cls");//清屏cout<<"********【所有數(shù)據(jù)】********"<<endl;cout<<"序號(hào)t學(xué)號(hào) 姓名 班級(jí) 分?jǐn)?shù)"<<endl;cout<<"*******【共 "<<list1.DisplayListData()<<" 人】******n"<<endl;list1.Compute(); system("pause");//暫停一下break;case 2:Add(list1);//添加操作break;case 3:Find(list1);//查找操作break;case 4:Update(list1);//更新操作(修改)break;case 5:Sort(list1);//排序操作break;case 6:Del(list1);//刪除操作break;case 7:ClearFileData();//清空文件數(shù)據(jù)list1.Clear();//清空鏈表數(shù)據(jù)break;case 0://退出程序return 0;default:cout<<"請(qǐng)輸入0~7"<<endl;system("pause");break;}}return 0; }list.h
#include <iostream> #include <fstream> #include <sstream> #include <iomanip> #include <stdlib.h> #define FILE_PATH "student.txt" //數(shù)據(jù)文件的路徑 using namespace std; //聲明 class CList; void Save2File(CList& list);//將數(shù)據(jù)保存到文件 void Read4File(CList& list);//讀取文件數(shù)據(jù)到鏈表bool CmpStr(string str1, string str2)//字符串比較函數(shù) {int len1 = str1.size();//字符串1的長(zhǎng)度int len2 = str2.size();//字符串2的長(zhǎng)度//將兩個(gè)字符串的長(zhǎng)度 添加為一樣長(zhǎng)(達(dá)到右對(duì)齊的效果)for(int i=0; i<len1-len2; i++)//如果字符串str1比str2長(zhǎng),在str2的前面補(bǔ)0{str2.insert(0, "0");//在最前面補(bǔ)0}for(int i=0; i<len2-len1; i++)//如果字符串str2比str1長(zhǎng),在str1的前面補(bǔ)0{str1.insert(0, "0");//在最前面補(bǔ)0}return str1>str2; }bool SortById(SNode* &p, SNode* &q)//按學(xué)號(hào)升序排序 {return ( p->stu.GetId()>q->stu.GetId() ); }bool SortByName(SNode* &p, SNode* &q)//按姓名升序排序 {return CmpStr(p->stu.GetName(), q->stu.GetName()); }bool SortByClass(SNode* &p, SNode* &q)//按班級(jí)升序排序 {return CmpStr(p->stu.GetClass(), q->stu.GetClass()); } bool SortByScore(SNode* &p, SNode* &q)//按Score升序排序 {return ( p->stu.GetScore()>q->stu.GetScore() ); }typedef bool (*FUNCP)(SNode* &p, SNode* &q);//函數(shù)指針 FUNCP pFunArr[] = {SortById, SortByName, SortByClass,SortByScore};//排序函數(shù)的指針數(shù)組//鏈表操作類(lèi) class CList {SNode* m_pListHead;//鏈表頭結(jié)點(diǎn)指針void Init_ListHead();//初始化頭結(jié)點(diǎn) public:CList();//無(wú)參構(gòu)造函數(shù),用來(lái)初始化成員,創(chuàng)建對(duì)象的時(shí)候自動(dòng)調(diào)用~CList();//析構(gòu)函數(shù),用來(lái)釋放格外申請(qǐng)的堆空間,(對(duì)象被銷(xiāo)毀的時(shí)候自動(dòng)調(diào)用)void AddHead(SNode& node);//頭插法 添加數(shù)據(jù)void AddTail(SNode& node);//尾插法 添加數(shù)據(jù)bool DelData(int id);//根據(jù)id刪除數(shù)據(jù)SNode* FindData(int id);//根據(jù)id查找指定數(shù)據(jù)bool UpdateData(int id, SNode& update);//根據(jù)id修改數(shù)據(jù)(更新)int DisplayListData();//顯示鏈表所有數(shù)據(jù),返回?cái)?shù)據(jù)條數(shù)SNode* GetListHead();//外界獲取頭結(jié)點(diǎn)指針的接口(頭指針是private權(quán)限)void Clear();//清空鏈表。釋放鏈表空間void Sort(int type = 0);//默認(rèn)按id升序排序int Size();void Compute();//獲取鏈表數(shù)據(jù)的個(gè)數(shù) };//類(lèi)成員函數(shù)的類(lèi)外實(shí)現(xiàn) CList::CList()//無(wú)參構(gòu)造函數(shù),用來(lái)初始化成員 {Init_ListHead();//初始化鏈表頭結(jié)點(diǎn) }CList::~CList()//析構(gòu)函數(shù),用來(lái)釋放格外申請(qǐng)的堆空間,(對(duì)象被銷(xiāo)毀的時(shí)候自動(dòng)調(diào)用) {Clear();//釋放鏈表空間delete m_pListHead;//釋放頭結(jié)點(diǎn),m_pListHead = NULL;//置空,防止重復(fù)操作 } void CList::Compute()//根據(jù)id升序排序 { int a=0,b=0,c=0;if(m_pListHead == NULL)//空鏈表直接返回{return;}SNode* p; //排序輔助指針(以p為基準(zhǔn),q遍歷連鏈表數(shù)據(jù),temp在交換的數(shù)據(jù)時(shí)使用,指向需要交換時(shí)的較大者)for(p = m_pListHead->next;p != NULL;p = p->next){if(p->stu.GetScore()<60)a++;else if(p->stu.GetScore()>=60&&p->stu.GetScore()<=80)b++;else if(p->stu.GetScore()>80)c++;}cout<<"60分以下(不含60分)的人數(shù)有:"<<a<<"人"<<endl;cout<<"60分以上80分以下(含80分)的人數(shù)有:"<<b<<"人"<<endl;cout<<"80分以上的人數(shù)有:"<<c<<"人"<<endl;if((a+b+c)!=0)cout<<"及格率為:"<<(float)(b+c)/(a+b+c)*100<<"%"<<endl;}void CList::Init_ListHead()//初始化頭結(jié)點(diǎn) {m_pListHead = new SNode;//初始化頭結(jié)點(diǎn)m_pListHead->stu.SetId(0);m_pListHead->stu.SetName("頭結(jié)點(diǎn)");m_pListHead->stu.SetClass("A班");m_pListHead->stu.SetScore(0);m_pListHead->next = NULL; }void CList::AddHead(SNode& node)//頭插法 添加數(shù)據(jù) {SNode* new_node = new SNode(node);new_node->next = NULL;if(m_pListHead == NULL)//頭結(jié)點(diǎn)為空,就初始化頭結(jié)點(diǎn){Init_ListHead();}if(m_pListHead->next == NULL)//如果除頭結(jié)點(diǎn)外還沒(méi)有數(shù)據(jù)節(jié)點(diǎn),直接讓頭結(jié)點(diǎn)指向新的節(jié)點(diǎn),新的節(jié)點(diǎn)作為第一個(gè)數(shù)據(jù)節(jié)點(diǎn){m_pListHead->next = new_node;}else //將新的節(jié)點(diǎn)作為第一個(gè)數(shù)據(jù)節(jié)點(diǎn)(頭結(jié)點(diǎn)后面的一個(gè)){new_node->next = m_pListHead->next;m_pListHead->next = new_node;} }void CList::AddTail(SNode& node)//尾插法 添加數(shù)據(jù) {SNode* new_node = new SNode(node);new_node->next = NULL;if(m_pListHead == NULL)//頭結(jié)點(diǎn)為空,就初始化頭結(jié)點(diǎn){Init_ListHead();}SNode* p = m_pListHead;while(p->next)//遍歷到鏈表最后一個(gè)節(jié)點(diǎn),直到p->next為NULL{p = p->next;}p->next = new_node;//鏈表最后的節(jié)點(diǎn)指向新的節(jié)點(diǎn),新的節(jié)點(diǎn)成為尾節(jié)點(diǎn)}bool CList::DelData(int id)//根據(jù)id刪除數(shù)據(jù) {if(m_pListHead == NULL){return false;}SNode* p = m_pListHead->next;//p遍歷節(jié)點(diǎn)SNode* q = m_pListHead;//q為p的前一個(gè)節(jié)點(diǎn)while(p != NULL)//遍歷鏈表{if(id == p->stu.GetId())//找到要?jiǎng)h除的數(shù)據(jù)節(jié)點(diǎn)p{q->next = p->next;delete p;p = NULL;//置空,防止再次操作造成隱蔽錯(cuò)誤return true;}q = p;p = p->next;}return false; }SNode* CList::FindData(int id)//根據(jù)id查找指定數(shù)據(jù) {if(m_pListHead == NULL){return NULL;}SNode* p = m_pListHead->next;//p遍歷節(jié)點(diǎn)while(p != NULL)//遍歷鏈表{if(id == p->stu.GetId())//找到要?jiǎng)h除的數(shù)據(jù)節(jié)點(diǎn)p{return p;}p = p->next;}return NULL; }bool CList::UpdateData(int id, SNode& update)//根據(jù)id修改數(shù)據(jù)(更新) {if(m_pListHead == NULL){return false;}SNode* findNode = NULL;findNode = FindData(id);if(findNode != NULL){//memcpy(findNode, &update, sizeof(SNode)-sizeof(SNode*));//更新數(shù)據(jù),不更新指針域findNode->stu.SetId(update.stu.GetId());findNode->stu.SetName(update.stu.GetName());findNode->stu.SetClass(update.stu.GetClass());findNode->stu.SetScore(update.stu.GetScore());return true;}return false; }int CList::DisplayListData()//顯示鏈表所有數(shù)據(jù) {if(m_pListHead == NULL){return 0;}int count = 0;//記錄數(shù)據(jù)的總條數(shù)SNode* p = m_pListHead->next;while(p != NULL)//遍歷鏈表{count++;cout<<"["<<count<<"]t"<<setw(4)<<p->stu.GetId()<<" "<<setw(8)<<p->stu.GetName()<<" "<<setw(8)<<p->stu.GetClass()<<setw(8)<<p->stu.GetScore()<<endl;//(setw(8)輸出寬度,默認(rèn)右對(duì)齊)p = p->next;}return count; }void CList::Clear()//清空鏈表。釋放鏈表空間 {if(m_pListHead == NULL){return;}SNode* p = m_pListHead->next;while(p != NULL)//遍歷鏈表{m_pListHead->next = p->next;delete p;p = m_pListHead->next;} }void CList::Sort(int type)//排序 {if(m_pListHead == NULL)//空鏈表直接返回{return;}SNode* p, *q, *bigger;//排序輔助指針(以p為基準(zhǔn),q遍歷連鏈表數(shù)據(jù),temp在交換的數(shù)據(jù)時(shí)使用,指向需要交換時(shí)的較大者)for(p = m_pListHead->next;p != NULL;p = p->next){bigger = p;for(q = p->next;q != NULL;q = q->next){if( pFunArr[type](bigger, q) )//前面的比后面的大,就交換{bigger = q;//指向需要交換時(shí)的較大者}}if(bigger != p)//需要交換{SNode temp = *bigger;//指針域不用交換bigger->stu.SetId(p->stu.GetId());bigger->stu.SetName(p->stu.GetName());bigger->stu.SetClass(p->stu.GetClass());bigger->stu.SetScore(p->stu.GetScore());p->stu.SetId(temp.stu.GetId());p->stu.SetName(temp.stu.GetName());p->stu.SetClass(temp.stu.GetClass());p->stu.SetScore(temp.stu.GetScore());}} }SNode* CList::GetListHead()//外界獲取頭結(jié)點(diǎn)指針的接口(頭指針是private權(quán)限) {return this->m_pListHead; }int CList::Size() {if(m_pListHead == NULL){return 0;}int count = 0;//數(shù)據(jù)的個(gè)數(shù)SNode* p = m_pListHead;while( (p=p->next) != NULL){count++;}return count; }void AddMenu()//添加 菜單 {cout<<"┏━━━━━━━━━━┓"<<endl;cout<<"┃ 添加菜單 ┃"<<endl;cout<<"┃ 【1】 添加到頭部 ┃"<<endl;cout<<"┃ 【2】 添加到尾部 ┃"<<endl;cout<<"┃ 【0】 返回 ┃"<<endl;cout<<"┗━━━━━━━━━━┛"<<endl;cout<<" ******請(qǐng)輸入0~2:"; }void Add(CList& list)//添加處理 {int id = -1;//接收用戶(hù)輸入的idstring name = "";//接收用戶(hù)輸入的姓名string _class = "";//接收用戶(hù)輸入的班級(jí)float score =0;SNode new_node;//存儲(chǔ)輸入的合法數(shù)據(jù)int choice = -1;//接收用戶(hù)選擇char save = 'Y';//是否將數(shù)據(jù)保存到文件char isAdd = 'N';//用來(lái)表識(shí) 用戶(hù)是否有添加過(guò)數(shù)據(jù),如果有會(huì)在返回上級(jí)菜單的時(shí)候提示用戶(hù)保存到文件char isContinue = 'Y';//表識(shí)是否繼續(xù)添加while(true){system("cls");//清屏AddMenu();//添加菜單cin>>choice;//接收用戶(hù)選擇switch(choice){case 1://頭插法case 2://尾部添加isContinue = 'Y';while(isContinue == 'Y' || isContinue == 'y')//循環(huán)添加{cout<<"請(qǐng)輸入學(xué)號(hào):";cin>>id;if(id<=0)//檢查用戶(hù)輸入的id是否合法{cout<<"序號(hào)應(yīng)大于0!請(qǐng)重新輸入!"<<endl;}else if(list.FindData(id) != NULL)//學(xué)號(hào)大于0但是已經(jīng)存在{cout<<"學(xué)號(hào) "<<id<<" 已經(jīng)存在!請(qǐng)重新輸入!"<<endl;}else//學(xué)號(hào)大于0且不存在{new_node.stu.SetId(id);//設(shè)置新的學(xué)號(hào)for(;;)//循環(huán)接收用戶(hù)輸入的姓名,直到姓名不為空{(diào)cout<<"請(qǐng)輸入姓名:";cin>>name;if(name.empty())//如果姓名為空{(diào)cout<<"姓名 不能為空!請(qǐng)重新輸入!(按0結(jié)束輸入)"<<endl;continue;}break;}if(name == "0")//如果姓名為0,結(jié)束添加{break;//跳出循環(huán)}new_node.stu.SetName(name);//設(shè)新節(jié)點(diǎn)的姓名for(;;)//循環(huán)接收用戶(hù)輸入的班級(jí),直到班級(jí)不為空{(diào)cout<<"請(qǐng)輸入班級(jí):";cin>>_class;if(_class.empty())//如果班級(jí)為空{(diào)cout<<"班級(jí) 不能為空!請(qǐng)重新輸入!(按0結(jié)束輸入)"<<endl;continue;}break;}if(_class == "0")//如果班級(jí)為0,結(jié)束添加{break;//跳出循環(huán)}new_node.stu.SetClass(_class);//設(shè)置新節(jié)點(diǎn)的班級(jí)for(;;)//循環(huán)接收用戶(hù)輸入的score,直到score不為空{(diào)cout<<"請(qǐng)輸入分?jǐn)?shù):";cin>>score;if(score<0){cout<<"分?jǐn)?shù)不能為負(fù)!請(qǐng)重新輸入!(按0結(jié)束輸入)"<<endl;continue;}break;}if(score==0)//如果分?jǐn)?shù)為0,結(jié)束添加{break;//跳出循環(huán)}new_node.stu.SetScore(score);if(choice == 1){list.AddHead(new_node);//頭插法添加到鏈表}else{list.AddTail(new_node);//尾插法添加到鏈表}isAdd = 'Y';//表識(shí)用戶(hù)添加了數(shù)據(jù)}cout<<"是否繼續(xù)添加?(y/n):";cin>>isContinue;}break;case 0:if(isAdd == 'Y')//用戶(hù)添加過(guò)數(shù)據(jù)才提示保存{cout<<"是否保存到文件?(y/n)"<<endl;cin>>save;if(save == 'Y'|| save == 'y'){Save2File(list);//將數(shù)據(jù)保存到文件cout<<"保存成功!"<<endl;system("pause");}else//不保存{list.Clear();//清除數(shù)據(jù)Read4File(list);//重新讀取數(shù)據(jù)}}return;default:cout<<"請(qǐng)輸入0~2"<<endl;system("pause");break;}} }void DelMenu()//刪除菜單 {cout<<"┏━━━━━━━━━━┓"<<endl;cout<<"┃ 刪除菜單 ┃"<<endl;cout<<"┃ 【1】 按學(xué)號(hào)刪除 ┃"<<endl;cout<<"┃ 【0】 返回 ┃"<<endl;cout<<"┗━━━━━━━━━━┛"<<endl;cout<<" ******請(qǐng)輸入0~1:"; }void Del(CList& list)//刪除操作 {int id = -1;char choice = '0';//用戶(hù)選擇bool isDel = false;//接收刪除結(jié)果char isSure = 'N';//提示用戶(hù) 確認(rèn)刪除SNode* findNode = NULL;//指向匹配的數(shù)據(jù)節(jié)點(diǎn)while(true){system("cls");//清屏DelMenu();cin>>choice;if(choice == '1'){cout<<"請(qǐng)輸入要?jiǎng)h除的學(xué)號(hào):";}else{break;}cin>>id;if(id == 0){break;}findNode = list.FindData(id);if(findNode != NULL)//存在目標(biāo)數(shù)據(jù){cout<<"學(xué)號(hào)"<<"t"<<"姓名"<<"t"<<"班級(jí)"<<"t"<<"分?jǐn)?shù)"<<endl;cout<<findNode->stu.GetId()<<"t"<<findNode->stu.GetName()<<"t"<<findNode->stu.GetClass()<<endl;cout<<"已經(jīng)找到學(xué)號(hào)為 "<<id<<"的數(shù)據(jù),是否刪除?(y/n):";cin>>isSure;if(isSure == 'Y' || isSure == 'y')//用戶(hù)確認(rèn)刪除{isDel = list.DelData(id);Save2File(list);//保存到文件if(isDel)//刪除成功{cout<<"已成功刪除id為"<<id<<"的數(shù)據(jù)"<<endl;}else{cout<<"刪除id為"<<id<<"的數(shù)據(jù) 失敗!"<<endl;}}}else{cout<<"請(qǐng)檢查"<<id<<"是否存在!"<<endl;}system("pause");} }void FindMenu()//查找的菜單 {cout<<"┏━━━━━━━━━━┓"<<endl;cout<<"┃ 查找菜單 ┃"<<endl;cout<<"┃ 【1】 按學(xué)號(hào)查找 ┃"<<endl;cout<<"┃ 【2】 按姓名查找 ┃"<<endl;cout<<"┃ 【3】 按班級(jí)查找 ┃"<<endl;cout<<"┃ 【0】 返回 ┃"<<endl;cout<<"┗━━━━━━━━━━┛"<<endl;cout<<" ******請(qǐng)輸入0~3:"; }void Find(CList& list)//查找操作 {int id = -1;//存放要查找的學(xué)號(hào)string name_class = "";//存放要查找的姓名(或班級(jí))int choice = -1;//接收用戶(hù)的選擇SNode* findNode = NULL;//接收查找結(jié)果while(true){system("cls");//清屏FindMenu();//查找菜單cin>>choice;//接收用戶(hù)選擇switch(choice){case 1://按學(xué)號(hào)查找,因?yàn)閷W(xué)號(hào)是唯一的,所以最多只有一個(gè)匹配的數(shù)據(jù)cout<<"請(qǐng)輸入要查找的學(xué)號(hào):";cin>>id;findNode = list.FindData(id);if(findNode != NULL)//找到數(shù)據(jù){cout<<"n已經(jīng)找到id為"<<id<<"的數(shù)據(jù)"<<endl;cout<<"學(xué)號(hào)"<<"t"<<"姓名"<<"t"<<"班級(jí)"<<endl;cout<<findNode->stu.GetId()<<"t"<<findNode->stu.GetName()<<"t"<<findNode->stu.GetClass()<<"t"<<findNode->stu.GetScore()<<endl;}else{cout<<"未找到,請(qǐng)檢查學(xué)號(hào) "<<id<<" 是否存在!"<<endl;}break;case 2://按姓名查找,可能有重名的,所以結(jié)果可能包含多個(gè)數(shù)據(jù)case 3:{if(choice == 2){cout<<"請(qǐng)輸入要查找的姓名:";}else{cout<<"請(qǐng)輸入要查找的班級(jí):";}cin>>name_class;CList findList;//存放查詢(xún)的結(jié)果findNode = list.GetListHead();//獲取鏈表頭結(jié)點(diǎn)if(findNode != NULL){findNode = findNode->next;while(findNode != NULL)//遍歷數(shù)據(jù)鏈表,匹配就添加到結(jié)果鏈表{if( ((choice == 2) && name_class == findNode->stu.GetName()) ||((choice == 3) && name_class == findNode->stu.GetClass()))//姓名(或班級(jí))匹配{findList.AddTail(*findNode);//添加到結(jié)果鏈表中}findNode = findNode->next;}}int count = findList.Size();//匹配到的數(shù)據(jù)數(shù)目if( count>0 )//如果結(jié)果鏈表中匹配到有數(shù)據(jù){if(choice == 2){cout<<"n已經(jīng)找到姓名為 "<<name_class<<" 的數(shù)據(jù)"<<endl;}else{cout<<"n已經(jīng)找到班級(jí)為 "<<name_class<<" 的數(shù)據(jù)"<<endl;}cout<<"學(xué)號(hào)"<<"t"<<"姓名"<<"t"<<"班級(jí)"<<endl;findNode = findList.GetListHead()->next;while(findNode != NULL){cout<<findNode->stu.GetId()<<"t"<<findNode->stu.GetName()<<"t"<<findNode->stu.GetClass()<<endl;findNode = findNode->next;}cout<<"*****【共 "<<count<<" 名學(xué)生】*****n"<<endl;}else{if(choice == 2){cout<<"未找到,請(qǐng)檢查姓名 "<<name_class<<" 是否存在!"<<endl;}else{cout<<"未找到,請(qǐng)檢查班級(jí) "<<name_class<<" 是否存在!"<<endl;}}break;}case 0://返回return;default:cout<<"請(qǐng)輸入0~3"<<endl;break;}system("pause");} }void UpdateMenu()//更新菜單 {cout<<"┏━━━━━━━━━━┓"<<endl;cout<<"┃ 更新菜單 ┃"<<endl;cout<<"┃ 【1】 按學(xué)號(hào)更新 ┃"<<endl;cout<<"┃ 【0】 返回 ┃"<<endl;cout<<"┗━━━━━━━━━━┛"<<endl;cout<<" ******請(qǐng)輸入0~1:"; }void Update(CList& list)//更新操作 {int id = -1;int choice = -1;//用戶(hù)的選擇bool isUpdate = NULL;//接收修改結(jié)果string name = "";//新的姓名string _class = "";//新的班級(jí)float score=0;SNode* findNode = NULL;//指向要更新的節(jié)點(diǎn)SNode update;//新的數(shù)據(jù)while(true){system("cls");//清屏UpdateMenu();//更新菜單cin>>choice;//接收用戶(hù)選擇switch(choice){case 1:cout<<"請(qǐng)輸入要更新的學(xué)號(hào):";cin>>id;findNode = list.FindData(id);if(findNode == NULL)//不存在目標(biāo)數(shù)據(jù),則重新輸入{cout<<"不存在此學(xué)號(hào)!"<<endl;system("pause");continue;}cout<<"n已經(jīng)找到id為"<<id<<"的數(shù)據(jù)"<<endl;cout<<"學(xué)號(hào)"<<"t"<<"姓名"<<"t"<<"班級(jí)"<<"t"<<"分?jǐn)?shù)"<<endl;cout<<findNode->stu.GetId()<<"t"<<findNode->stu.GetName()<<"t"<<findNode->stu.GetClass()<<"t"<<findNode->stu.GetScore()<<endl;update = *findNode;cout<<"【輸入0,表示不更改】"<<endl;cout<<"將姓名:"<<findNode->stu.GetName()<<" 改為:";cin>>name;if(name != "0"){update.stu.SetName(name);}cout<<"將分?jǐn)?shù):"<<findNode->stu.GetScore()<<" 改為:";cin>>score;if(score != 0){update.stu.SetScore(score);}cout<<"將班級(jí):"<<findNode->stu.GetClass()<<" 改為:";cin>>_class;if(_class != "0"){update.stu.SetClass(_class);}if(name != "0" || _class != "0")//用戶(hù)有更改{isUpdate = list.UpdateData(id, update);if(isUpdate == true){Save2File(list);//保存到文件cout<<"更新成功!"<<endl;}else{cout<<"更新失敗!"<<endl;}}else{cout<<"未更改!"<<endl;}break;case 0:return;default:cout<<"請(qǐng)輸入0~1"<<endl;break;}system("pause");//因?yàn)橛星迤羷?dòng)作,所以暫停一下,讓用戶(hù)查看輸出信息} }void Save2File(CList& list)//將數(shù)據(jù)保存到文件 {SNode* listHead = list.GetListHead();//獲取到鏈表頭結(jié)點(diǎn)if(listHead == NULL){return;}ofstream fout(FILE_PATH,ios_base::binary);//不存在則創(chuàng)建,存在則會(huì)清空。//fout.clear();//清空文件數(shù)據(jù)SNode* p = listHead->next;while(p !=NULL ){fout<<p->stu.ToString()<<" ";//以空格分隔數(shù)據(jù)p = p->next;}fout.close();//關(guān)閉流return; }void Read4File(CList& list)//讀取文件數(shù)據(jù) 到鏈表中 {SNode node;int beforeId = -1;//上一個(gè)idint id = -1;//臨時(shí)存放學(xué)號(hào)string name = "";//臨時(shí)存放姓名string _class = "";//存放班級(jí)float score=0;ifstream fin;fin.open(FILE_PATH, ios_base::in);//打開(kāi)文件if(fin == NULL)//文件不存在,直接返回{return;}while(!fin.eof())//循環(huán)讀取直到文件末尾{fin>>id>>name>>_class>>score;if(id>0 && id != beforeId)//因?yàn)榭崭竦脑?讀取讀后一個(gè)數(shù)據(jù)兩次,這里使用beforeId來(lái)避免重復(fù)添加{node.stu.SetId(id);node.stu.SetName(name);node.stu.SetClass(_class);node.stu.SetScore(score);list.AddTail(node);//添加}beforeId = id;//記錄上一次id}fin.close();//關(guān)閉文件流return; }void ClearFileData()//清空文件數(shù)據(jù),方便測(cè)試 {char isSure = 'n';//是否確認(rèn)清除數(shù)據(jù)cout<<"確認(rèn)清除文件數(shù)據(jù)?(y/n):";cin>>isSure;if(isSure == 'Y' || isSure == 'y'){ofstream fout(FILE_PATH);//不存在則創(chuàng)建,存在則會(huì)清空f(shuō)out.close();cout<<"清除文件數(shù)據(jù)成功!"<<endl;system("pause");} }void SortMenu()//排序菜單 {cout<<"┏━━━━━━━━━━┓"<<endl;cout<<"┃ 排序菜單 ┃"<<endl;cout<<"┃ 【1】 按學(xué)號(hào)排序 ┃"<<endl;cout<<"┃ 【2】 按姓名排序 ┃"<<endl;cout<<"┃ 【3】 按班級(jí)排序 ┃"<<endl;cout<<"┃ 【4】 按分?jǐn)?shù)排序 ┃"<<endl;cout<<"┃ 【0】 返回 ┃"<<endl;cout<<"┗━━━━━━━━━━┛"<<endl;cout<<" ******請(qǐng)輸入0~4:"; }void Sort(CList& list) {char isSave = 'n';//是否將排序后的數(shù)據(jù)更新到文件int choice = -1;while(true){system("cls");//清屏SortMenu();cin>>choice;switch(choice){case 1://按學(xué)號(hào)排序case 2://按姓名排序case 3:case 4://按班級(jí)排序list.Sort(choice-1);if(choice == 1){cout<<"***按學(xué)號(hào)升序排序如下:"<<endl;}else if(choice == 2){cout<<"***按姓名升序排序如下:"<<endl;}else if(choice == 3){cout<<"***按班級(jí)升序排序如下:"<<endl;}else if(choice == 4){cout<<"***按分?jǐn)?shù)升序排序如下:"<<endl;}cout<<"序號(hào)t學(xué)號(hào) 姓名 班級(jí) 分?jǐn)?shù)"<<endl;list.DisplayListData();//顯示cout<<"是否將排序后的數(shù)據(jù)更新到文件?(y/n):";cin>>isSave;if(isSave == 'Y' || isSave == 'y')//確認(rèn)保存到文件{Save2File(list);//將數(shù)據(jù)重新寫(xiě)入到文件cout<<"保存數(shù)據(jù)成功!"<<endl;system("pause");}else{list.Clear();//清空鏈表數(shù)據(jù)Read4File(list);//重新加載數(shù)據(jù)文件}break;case 0:return;break;default:cout<<"請(qǐng)輸入0~3"<<endl;system("pause");break;}} }void MainMenu()//主菜單 {cout<<"┏━━━━━━━━┓"<<endl;cout<<"┃學(xué)生信息管理程序┃"<<endl;cout<<"┃ 【1】 顯示 ┃"<<endl;cout<<"┃ 【2】 添加 ┃"<<endl;cout<<"┃ 【3】 查找 ┃"<<endl;cout<<"┃ 【4】 修改 ┃"<<endl;cout<<"┃ 【5】 排序 ┃"<<endl;cout<<"┃ 【6】 刪除 ┃"<<endl;cout<<"┃ 【7】 清空 ┃"<<endl;cout<<"┃ 【0】 退出 ┃"<<endl;cout<<"┗━━━━━━━━┛"<<endl;cout<<" *****請(qǐng)輸入0~7:"; }node.h
//鏈表節(jié)點(diǎn) typedef struct SNode {Student stu;//數(shù)據(jù)域struct SNode* next;//指針域SNode()//無(wú)參構(gòu)造函數(shù){stu.SetId(0);next = NULL;}SNode(int id)//有參構(gòu)造函數(shù){stu.SetId(id);next = NULL;} }SNode;student.h
//學(xué)生類(lèi) #include <sstream> using namespace std;//int轉(zhuǎn)string class Student { private:int m_id;//學(xué)號(hào)string m_name;//姓名string m_class;//班級(jí)float m_score; public:Student()//無(wú)參構(gòu)造函數(shù){m_id = 0;m_score=0;m_name = "0";m_class = "0";}Student(int id, string name, string _class,float score)//有參構(gòu)造函數(shù),class是關(guān)鍵字,所以不能用作變量名{if(id < 0)//確保id不為負(fù)數(shù){id = 0;}this->m_id = id;if(name.empty())//確保name不為空{(diào)name = "0";}this->m_name = name;if(_class.empty())//確保_class不為空{(diào)_class = "0";}this->m_class = _class;if(score<0)//確保_class不為空{(diào)score = 0;}this->m_score = score;}void SetId(int id)//設(shè)置id{if(id < 0 )//確保id>0,id=0為無(wú)效{id = 0;}this->m_id = id;}int GetId()//獲取id{return this->m_id;}void SetName(string name)//設(shè)置姓名{if(name.empty())//確保name不為空{(diào)name = "0";}this->m_name = name;}string GetName()//獲取姓名{return this->m_name;}void SetClass(string _class)//設(shè)置班級(jí){if(_class.empty())//確保_class不為空{(diào)_class = "0";}this->m_class = _class;}string GetClass()//獲取班級(jí){return this->m_class;}void SetScore(float score)//設(shè)置id{if(score < 0 )//確保id>0,id=0為無(wú)效{score = 0;}this->m_score = score;}float GetScore()//獲取id{return this->m_score;}string ToString()//將數(shù)據(jù)轉(zhuǎn)為字符串形式,方便存到文件中{stringstream ss;ss<<m_id<<" "<<m_name<<" "<<m_class<<" "<<m_score;//學(xué)號(hào) 姓名 班級(jí)return ss.str();} };使用GCC編譯。
總結(jié)
以上是生活随笔為你收集整理的c读取txt文件内容并建立一个链表_C++链表实现学生信息管理系统的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 梦到沙发是什么意思
- 下一篇: 单据打印_Excel多功能进销存套表,自