




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
#include<iostream>#include<fstream>#include<windows.h>#include<iomanip>usingnamespacestd;//定義一個(gè)學(xué)生結(jié)構(gòu)體structStudent{charsn[5];//學(xué)號(hào)charname[10];//姓名};//函數(shù)原型聲明voidmainForm(fstream&);voidmainMenu();voidinputInfo(fstream&);//錄入功能模塊voidshowAll(fstream&);//顯示功能模塊voidfind(fstream&);//查找功能模塊voidmodify(fstream&);//修改功能模塊voiddel(fstream&);//刪除功能模塊voidsort(fstream&);//排序功能模塊voidshowHead();//輸出表頭信息voidshowInfo(structStudent);//顯示一條記錄voidfopen(fstream&);//打開(kāi)文件及檢測(cè)boolfindBySn(fstream&,char*);//按學(xué)號(hào)關(guān)鍵字查找boolgetFromFile(fstream&,structStudent&,int);//從文件中獲取指定位置的記錄給結(jié)構(gòu)體變量intgetMinPosition(fstream&,structStudent&);//獲取最小sn記錄位置booldelBySn(fstream&,char*);//從文件中刪除指定sn的記錄boolwriteOne(fstream&,structStudent);//主函數(shù)voidmain(){//如果以app方式新建文件,每次運(yùn)行時(shí),不會(huì)清空文件內(nèi)容,而且student.txt文件不存在,也會(huì)新建文件//但是,新建文件時(shí),如果不加上ios::app打開(kāi)方式,如果文件不存在,還會(huì)出錯(cuò),如果文件存在,會(huì)清空文件內(nèi)容//所以,我們?cè)谡n程設(shè)計(jì)中,新建文件最好以app方式打開(kāi),以免每運(yùn)行一次,文件內(nèi)容被清空一次,每次都要錄入//數(shù)據(jù),影響效率。我彳門(mén)可以在主函數(shù)main()的開(kāi)始,就以app方式新建fstream對(duì)象,在其它函數(shù)中,將fstream對(duì)象作//實(shí)參傳遞給fstream引用。fstreamfs("student.txt",ios::in|ios二out|ios::app);if(!fs)
cout<<"文件打開(kāi)失敗"<<endl;abort();)fs.close();//每個(gè)功能模塊開(kāi)始都會(huì)重新打開(kāi)文件,模塊結(jié)束時(shí),都關(guān)閉文件//調(diào)用主界面函數(shù)mainForm(fs);)//主界面voidmainForm(fstream&fs)(system("CLS");〃清屏mainMenu();//調(diào)用主菜單intoption;//菜單號(hào)cin>>option;while(option)//如果選項(xiàng)不為0,就可循環(huán)輸入(switch(option)(case1:inputInfo(fs);break;//(case1:inputInfo(fs);break;//case2:showAll(fs);break;//case3:find(fs);break;//case4:modify(fs);break;//case5:del(fs);break;//case6:sort(fs);break;//序,所以這個(gè)可以不要default:cout<<"輸入有誤,錄入數(shù)據(jù)顯示所有數(shù)據(jù)查找修改刪除排序,因?yàn)殇浫霐?shù)據(jù)模塊中有了自動(dòng)排請(qǐng)重新輸入!"<<endl;system("PAUSE");)mainMenu();//清屏后再顯示主菜單cin>>option;//重新輸入菜單項(xiàng))cout<<"即將退出系統(tǒng)"<<endl;Sleep(500);//暫停0.5秒,需要加上頭文件windows.h,注意,Sleep()的s要大寫(xiě))voidmainMenu()(學(xué)生信息系統(tǒng)system("CLS");//清屏學(xué)生信息系統(tǒng)cout<<"************************************************<<endl<<endl;cout<<"cout<<".錄入信息"cout<<"cout<<".顯示信息"<<endl;cout<<"3.查找"<<endl;cout<<"4.修改"<<endl;cout<<"5.刪除"<<endl;cout<<"6.排序"<<endl;cout<<"0.退出系統(tǒng)"<<endl<<endl;cout<<"輸入菜單項(xiàng)【0-6】:";voidinputInfo(fstream&fs)(//不以追加方式打開(kāi)fopen(fs);//功能模塊開(kāi)始,打開(kāi)文件//創(chuàng)建結(jié)構(gòu)體變量structStudentstud;boolinputSuccess=false;//用于錄入數(shù)據(jù)后自動(dòng)排序的依據(jù),如果錄入成功,就排序,否則不排序charcontinueInput;//是否繼續(xù)新建學(xué)生對(duì)象,值為Y或y繼續(xù),其它值結(jié)束新建do(cout<<"學(xué)號(hào):";cin>>stud.sn;cout<<"姓名:";cin>>;//將結(jié)構(gòu)體變量寫(xiě)入到文件中fs.seekg(0,ios::beg);//將讀指針置于文件首位置,便于findBySn()函數(shù)在文件中查找if(!findBySn(fs,stud.sn))(fs.clear();//這個(gè)很重要,去掉就寫(xiě)入不成功,其作用見(jiàn)fopen()函數(shù)中的注釋writeOne(fs,stud);cout<<"錄入成功!"<<endl;inputSuccess=true;//只要錄入數(shù)據(jù)成功一次,inputSuccess就為真,文件中數(shù)據(jù)更新,自動(dòng)排序)else(cout<<"該記錄已存在,無(wú)法保存!"<<endl;)cout<<"是否繼續(xù)錄入學(xué)生信息?輸入Y|y繼續(xù),否則結(jié)束錄入"<<endl;cin>>continueInput;}while(continueInput=='Y'||continueInput=='y');fs.close();//功能模塊結(jié)束,if(inputSuccess){cout<<"\n自動(dòng)";sort(fs);}〃排序//顯示學(xué)生信息voidshowAll(fstream&fs)(fopen(fs);//功能模塊開(kāi)始,打開(kāi)文件structStudentstud;//創(chuàng)建一個(gè)結(jié)構(gòu)體變量//換一種算法:顯示文件中全部記錄intposition=0;showHead();while(getFromFile(fs,stud,position))(showInfo(stud);position=fs.tellg();//tellg()功能:返回fs對(duì)象讀指針位置,文件首位置是0,第二記錄是0+sizeof(Student)=15}cout<<"\n共有"<<position/sizeof(Student)<<"條記錄\n\n\n";system("pause");fs.close();//功能模塊結(jié)束,關(guān)閉文件}//顯木當(dāng)前記錄voidshowHead()(cout.setf(ios::left);cout<<setw(10)<<"學(xué)號(hào)"<<setw(15)<<"姓名"<<endl;}voidshowInfo(structStudentstud)(cout.setf(ios::left);cout<<""<<endl;cout<<setw(10)<<stud.sn<<setw(15)<<<<endl;}〃打開(kāi)文件,打開(kāi)方式in,outvoidfopen(fstream&fs)(//ifstream,ofstream,fstream是有狀態(tài)的對(duì)象,一個(gè)對(duì)象操作完后一般處于非正常狀態(tài),//內(nèi)部的eofbit標(biāo)記failbit標(biāo)記等可能已被設(shè)定。重新打開(kāi)文件并不會(huì)清除這些標(biāo)記,//因此需要添加對(duì)象的clear()方法,除去ifs中的錯(cuò)誤標(biāo)記(如文件末尾標(biāo)記或讀取失敗標(biāo)記等)fs.clear();//這個(gè)很重要,如果去掉,連續(xù)兩次調(diào)用showAll()等就會(huì)出錯(cuò)。fs.open("student.txt",ios::in|ios::out);if(!fs)(cout<<"打開(kāi)文件失敗,可能文件丟失或損壞!即將退出系統(tǒng)"<<endl;Sleep(500);exit(0);))voidfind(fstream&fs)(fopen(fs);//功能模塊開(kāi)始,打開(kāi)文件charsn[5];structStudentstud;cout<<"按學(xué)號(hào)查找,請(qǐng)車(chē)^入要學(xué)號(hào):";cin>>sn;if(findBySn(fs,sn))(cout<<"記錄查找到:\n";if(fs.read((char*)&stud,sizeof(Student)))(showHead();showInfo(stud);))elsecout<<"文件中不存在學(xué)號(hào)為"<<sn<<"的記錄!"<<endl<<endl;system("PAUSE");fs.close();//功能模塊結(jié)束,關(guān)閉文件)//按學(xué)號(hào)查找,找到返回真,并將讀指真seekg()定位于該記錄上,否則返回假,讀指針定位于文件尾boolfindBySn(fstream&fs,char*sn)(structStudentstud;fs.clear();fs.seekg(0,ios::beg);while(!fs.eof())(if(fs.read((char*)&stud,sizeof(Student)))(if(strcmp(stud.sn,sn)==0)(fs.seekg(-sizeof(Student),ios::cur);//讀指針定位于找至U的記錄returntrue;//如果找到第一條,就結(jié)束,用于對(duì)文件記錄關(guān)鍵字查找)returnfalse;)〃修改功能模塊voidmodify(fstream&fs)(fopen(fs);//功能模塊開(kāi)始,打開(kāi)文件structStudentstud;charsn[5];cout<<"要修改記白學(xué)號(hào):";cin>>sn;if(findBySn(fs,sn))(strcpy(stud.sn,sn);cout<<"請(qǐng)輸入要修改的相關(guān)數(shù)據(jù):"<<endl;cout<<"姓名:";cin>>;fs.clear();if(fs.write((char*)&stud,sizeof(Student)))〃文件寫(xiě)入不一定能成功cout<<"數(shù)據(jù)修改成功!"<<endl;elsecout<<"數(shù)據(jù)修改失敗,可能磁盤(pán)已滿!"<<endl;)else(cout<<"記錄不存在,檢查輸入的學(xué)號(hào)是否正確!"<<endl;system("PAUSE");)fs.close();//功能模塊結(jié)束,關(guān)閉文件)//刪除功能模塊voiddel(fstream&fs)(fopen(fs);//功能模塊開(kāi)始,打開(kāi)文件charsn[5];cout<<"被刪除記錄的學(xué)號(hào):";cin>>sn;if(delBySn(fs,sn))cout<<"記錄刪除成功!"<<endl;elsecout<<"記錄刪除失敗,請(qǐng)確認(rèn)記錄是否存在!"<<endl;system("PAUSE");)//從文件中刪除指定sn的記錄,執(zhí)行完該函數(shù)后,fs文件被關(guān)閉booldelBySn(fstream&fs,char*sn)(ofstreambakfile("bakfile.txt");//新建備份文件if(!bakfile)(cout<<"打開(kāi)文件失敗,即將退出系統(tǒng)"<<endl;Sleep(1000);exit(0);}structStudentstud;if(findBySn(fs,sn))//如果找到,就執(zhí)行刪除操作(fs.clear();fs.seekg(0,ios::beg);while(!fs.eof())//將第6條記錄到最后一條寫(xiě)入到文件中,分兩次寫(xiě)入,免得每條記錄都要比較(if(fs.read((char*)&stud,sizeof(Student))){//寫(xiě)入到備份文件if(strcmp(stud.sn,sn)!=0){if(bakfile.write((char*)&stud,sizeof(Student))){//showInfo(stud);}else{cout<<"將文件記錄備份失敗!"<<endl;returnfalse;}}}}}else{//cout<<"要?jiǎng)h除的記錄不存在!"<<endl;//system("PAUSE");bakfile.close();fs.close();//功能模塊結(jié)束,關(guān)閉文件returnfalse;}bakfile.close();fs.close();//功能模塊結(jié)束,關(guān)閉文件if(remove("student.txt")!=0)//remove()返回0表示刪除成功,-1刪除失perror("remove");system("pause");returnfalse;)〃輸出失敗的原因,如:remove:Permissiondenied刪除權(quán)限不夠//如果確定不是只讀等屬性,不是管理權(quán)限問(wèn)題,可能是被某個(gè)程序占用,按以下方法可以查看并結(jié)束被占用狀態(tài)//“開(kāi)始”菜單->"搜索程序和文件"搜索框內(nèi)輸入"資源監(jiān)視器”,打開(kāi)資源監(jiān)視器//在該窗口中,切換到cpu頁(yè)簽,然后在關(guān)聯(lián)的句柄中,輸入要?jiǎng)h除的文件名(student.txt),按下回車(chē)鍵//即可查找到被占用的進(jìn)程,結(jié)束占用。rename("bakfile.txt","student.txt");returntrue;)//從文件中獲取指定位置的記錄(給結(jié)構(gòu)體)boolgetFromFile(fstream&fs,structStudent&stud,intposition){fs.clear();fs.seekg(position,ios::beg);if(fs.read((char*)&stud,sizeof(Student)))returntrue;elsereturnfalse;)//排序功能模塊--按關(guān)鍵字sn排序//思路:step1:找到最小記錄位置,用writeMin()寫(xiě)入到sortfile.txt中//step2:將最小記錄刪除delBySn()//step3:重復(fù)step1,step2,直到文件空//step4:刪除student.txt,然后將sortfile.txt改名為student.txtvoidsort(fstream&fs)//排序完,文件關(guān)閉狀態(tài){fopen(fs);fstreamsortFile("sortfile.txt",ios::out|ios::app);//排序備份文件structStudentstud;intminPosition;//=fs.tellg();//獲取student.txt文件打開(kāi)后初始置(文件首)minPosition=getMinPosition(fs,stud);//獲取student.txt中最小sn記錄位置cout<<"排序中>";//裝逼用while(minPosition!=-1)〃文件尾時(shí),tellg()=-1{//將找到的最小記錄寫(xiě)入到sortfile.txtif(!writeOne(sortFile,stud)){
cout<<"\nsortfile.txt寫(xiě)入失敗,請(qǐng)查看文件是否存在或?yàn)橹蛔xcout<<"\nsortfile.txt寫(xiě)入失敗,請(qǐng)查看文件是否存在或?yàn)橹蛔x"<<endl;sortFile.close();fs.close();return;)〃刪除student.txt中最小的那條記錄if(!delBySn(fs,stud.sn))//因?yàn)檫@個(gè)delBySn()執(zhí)行完后,fs被關(guān)閉,所以后面要再次打開(kāi)fscout<<"排序操作失敗,可能是stduent.txt數(shù)據(jù)刪除權(quán)限問(wèn)題!"<<endl;fopen(fs);//重新打開(kāi)文件minPosition=getMinPosition(fs,stud);〃獲取student.txt中最小sn記錄位置Sleep(100);//裝逼用cout<<">";//裝逼用)cout<<"OK!";//裝逼用Sleep(500);//裝逼用sortFile.close();fs.close();remove("student.txt");rename("sortfile.txt","student.txt");)〃讀指針置于文件中最小記錄的位置,返回該值,并將最小記錄保存在stud結(jié)構(gòu)體變量中intgetMinPosition(fstream&fs,structStudent&stud){fs.clear();
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年浙江省建筑安全員《B證》考試題庫(kù)
- 《公共政策學(xué)》題庫(kù)及答案 2
- 西安信息職業(yè)大學(xué)《商業(yè)倫理》2023-2024學(xué)年第二學(xué)期期末試卷
- 2024-2025學(xué)年山東省聊城市高唐縣第二中學(xué)高三上學(xué)期12月月考?xì)v史試卷
- 武漢船舶職業(yè)技術(shù)學(xué)院《R語(yǔ)言與數(shù)據(jù)可視化》2023-2024學(xué)年第二學(xué)期期末試卷
- 湖南財(cái)經(jīng)工業(yè)職業(yè)技術(shù)學(xué)院《斜視弱視學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 2025青海省安全員《C證》考試題庫(kù)
- 濰坊理工學(xué)院《經(jīng)濟(jì)統(tǒng)計(jì)學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 臨夏現(xiàn)代職業(yè)學(xué)院《數(shù)字信號(hào)處理A》2023-2024學(xué)年第二學(xué)期期末試卷
- 平頂山學(xué)院《安全類專業(yè)寫(xiě)作》2023-2024學(xué)年第二學(xué)期期末試卷
- 《網(wǎng)絡(luò)服務(wù)器搭建、配置與管理-Linux(RHEL8、CentOS8)(微課版)(第4版)》全冊(cè)電子教案
- 心理評(píng)估與診斷簡(jiǎn)介
- 無(wú)痛病房管理課件
- 讓孩子變成學(xué)習(xí)的天使——由《第56號(hào)教室的奇跡》讀書(shū)分享
- 球泡檢驗(yàn)標(biāo)準(zhǔn)
- 公安筆錄模板之詢問(wèn)嫌疑人(書(shū)面?zhèn)鲉局伟舶讣?
- 振動(dòng)分析基礎(chǔ)講義1
- 記賬憑證匯總表excel模板
- 鄧麗君經(jīng)典歌曲30首簡(jiǎn)譜(共33頁(yè))
- 故障診斷技術(shù)的國(guó)內(nèi)外發(fā)展現(xiàn)狀(共3頁(yè))
- 園林綠化施工通用表格模板
評(píng)論
0/150
提交評(píng)論