C文件和IO流final課稿實(shí)用_第1頁(yè)
C文件和IO流final課稿實(shí)用_第2頁(yè)
C文件和IO流final課稿實(shí)用_第3頁(yè)
C文件和IO流final課稿實(shí)用_第4頁(yè)
C文件和IO流final課稿實(shí)用_第5頁(yè)
已閱讀5頁(yè),還剩40頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

會(huì)計(jì)學(xué)1C文件和IO流final課稿實(shí)用主要內(nèi)容C++中,文件組織記錄的兩種方式順序文件方式(ASCII碼文件)隨機(jī)存取文件方式(二進(jìn)制文件)文件的創(chuàng)建、讀寫(xiě)、定位等基本操作(重點(diǎn))如何利用文件完成事務(wù)處理(難點(diǎn))I/O流庫(kù)常見(jiàn)的流操縱符及其用法第1頁(yè)/共45頁(yè)數(shù)據(jù)的層次第2頁(yè)/共45頁(yè)記錄的組織方式有許多種在文件中組織記錄的方法順序文件隨機(jī)存取文件順序文件中記錄一般按照關(guān)鍵字的順序進(jìn)行存放每條記錄不等長(zhǎng)隨機(jī)存取文件能實(shí)現(xiàn)在常數(shù)時(shí)間內(nèi)存取文件中的某條記錄最常見(jiàn)的一種實(shí)現(xiàn)方式是將每條記錄視為等長(zhǎng)進(jìn)行存取這是利用文件進(jìn)行事務(wù)處理采用的主要方式第3頁(yè)/共45頁(yè)文件和流C++將每個(gè)文件看成是字符序列。每個(gè)文件都以文件結(jié)束符結(jié)尾C++的I/O是以一連串的字節(jié)流的方式進(jìn)行輸入操作中,字節(jié)從設(shè)備(鍵盤(pán)、磁盤(pán)驅(qū)動(dòng)器、網(wǎng)絡(luò)連接)流向內(nèi)存輸出操作中,字節(jié)從內(nèi)存流向設(shè)備(顯示器、打印機(jī)、磁盤(pán)驅(qū)動(dòng)器、網(wǎng)絡(luò)連接)字節(jié)可以組成字符、原始數(shù)據(jù)、圖形圖像、音頻、視頻在C++中執(zhí)行一個(gè)文件處理,必須包含文件<iostream>、<fstream>第4頁(yè)/共45頁(yè)IO流庫(kù)的類(lèi)(模板)層次結(jié)構(gòu)第5頁(yè)/共45頁(yè)I/O流庫(kù)中常用的typedef2023/1/17第6頁(yè)/共45頁(yè)I/O流庫(kù)3個(gè)全局標(biāo)準(zhǔn)流對(duì)象cin(istream類(lèi))從標(biāo)準(zhǔn)用戶(hù)終端(鍵盤(pán))讀入數(shù)據(jù)cin>>x,代表數(shù)據(jù)移動(dòng)方式是從終端移動(dòng)到變量x中cout(ostream類(lèi))向標(biāo)準(zhǔn)用戶(hù)終端(顯示器)寫(xiě)數(shù)據(jù)cout<<x,代表數(shù)據(jù)移動(dòng)方式是從變量x移動(dòng)到終端cerr(ostream類(lèi))標(biāo)準(zhǔn)錯(cuò)誤的ostream對(duì)象,是導(dǎo)出程序錯(cuò)誤消息的地方,默認(rèn)仍導(dǎo)出至顯示器且是非緩沖式輸出clog(ostream類(lèi))向標(biāo)準(zhǔn)用戶(hù)終端(顯示器)寫(xiě)日志信息,緩沖式輸出第7頁(yè)/共45頁(yè)文件的打開(kāi)通過(guò)創(chuàng)建ifstream、ofstream、fstream對(duì)象來(lái)操縱文件ofstream對(duì)象向文件輸出數(shù)據(jù),其打開(kāi)方式默認(rèn)為ios::out,該打開(kāi)方式在打開(kāi)已存在的文件時(shí),文件中原來(lái)存在的數(shù)據(jù)都將丟失ifstream對(duì)象從文件讀取數(shù)據(jù),其打開(kāi)方式默認(rèn)為ios::infstream對(duì)象以讀寫(xiě)方式打開(kāi)文件通過(guò)文件流對(duì)象完成數(shù)據(jù)的讀寫(xiě)操作結(jié)合運(yùn)算符<<、>>完成,格式為:ofstream對(duì)象<<數(shù)據(jù)ifstream對(duì)象>>數(shù)據(jù)第8頁(yè)/共45頁(yè)文件打開(kāi)模式第9頁(yè)/共45頁(yè)比較ios::app和ios::ateios::appapp代表append,該方式每次寫(xiě)入的內(nèi)容均位于文件末尾ios::ateate代表attheend,該方式第一次寫(xiě)入的內(nèi)容在文件末尾,但隨后寫(xiě)入的位置是當(dāng)前位置2023/1/17第10頁(yè)/共45頁(yè)順序文件的創(chuàng)建#include<iostream>#include<fstream>#include<string>#include<cstdlib>usingnamespacestd;intmain(){

ofstreamoutClientFile("Client.dat",ios::out); if(!outClientFile)//什么時(shí)候文件打開(kāi)會(huì)失???

{ cerr<<"Filecannotbeopened."<<endl; exit(EXIT_FAILURE); }第11頁(yè)/共45頁(yè)intid; stringname; doublebalance; cout<<"inputidnameandbalanca:\n"; cout<<"enterctrl+ztoendinput.\n"; while(cin>>id>>name>>balance) {

outClientFile<<id<<''<<name<<''<<balance<<endl; } return0;}//思考1:循環(huán)何時(shí)結(jié)束?//思考2:為什么沒(méi)有關(guān)閉文件的代碼?第12頁(yè)/共45頁(yè)說(shuō)明文件打開(kāi)失敗的情況很多,如:嘗試打開(kāi)并讀取不存在的文件在沒(méi)有權(quán)限的情況下對(duì)文件進(jìn)行讀寫(xiě)打開(kāi)文件并寫(xiě)入數(shù)據(jù)時(shí),磁盤(pán)空間不足ofstream對(duì)象可以在沒(méi)有打開(kāi)特定文件的情況下被創(chuàng)建,再通過(guò)成員函數(shù)open打開(kāi)一個(gè)文件,并將其關(guān)聯(lián)到已存在的ofstream對(duì)象上outClientFile.open("Client.dat",ios::out);主函數(shù)終止時(shí),將隱式調(diào)用outClientFile的析構(gòu)函數(shù)關(guān)閉文件Client.dat,也可通過(guò)成員函數(shù)close顯示關(guān)閉ofstream對(duì)象,減少資源占用第13頁(yè)/共45頁(yè)順序文件的讀出#include<iostream>#include<iomanip>#include<fstream>#include<string>#include<cstdlib>usingnamespacestd;intmain(){

ifstreaminClientFile("Client.dat",ios::in);//最小權(quán)限 if(!inClientFile)//重載operator!() { cerr<<"Filecannotbeopened."<<endl; exit(EXIT_FAILURE); }第14頁(yè)/共45頁(yè) intid; stringname; doublebalance; cout<<left<<setw(8)<<"id" <<setw(10)<<"name" <<setw(13)<<"balance"<<endl; while(inClientFile>>id>>name>>balance) { cout<<left<<setw(8)<<id <<setw(10)<<name <<setw(13)<<balance<<endl; } return0;}第15頁(yè)/共45頁(yè)思考思考能否修改順序文件中的記錄,如:原紀(jì)錄:1Elly0.0修改為:1Elizabeth0.0由于順序文件是將每條記錄中的數(shù)據(jù)按照字符進(jìn)行存儲(chǔ),故每條數(shù)據(jù)不等長(zhǎng),故上述修改會(huì)破壞該記錄之后的數(shù)據(jù),可見(jiàn),格式化的輸入/輸出通常不用于更新數(shù)據(jù)第16頁(yè)/共45頁(yè)文件定位ifstream類(lèi)的文件重定位函數(shù)seekg()每個(gè)ifstream對(duì)象都有一個(gè)get(讀取)指針指出文件中下一個(gè)輸入的字節(jié)號(hào)tellg返回當(dāng)前get指針的位置ofstream類(lèi)的文件重定位函數(shù)seekp()每個(gè)ofstream對(duì)象都有一個(gè)put(寫(xiě)入)指針指出文件中下一個(gè)輸入的字節(jié)號(hào)tellp返回當(dāng)前get指針的位置第17頁(yè)/共45頁(yè)seekg用法示例ios::beg

Seekfromthebeginningofthestream.

ios::cur

Seekfromthecurrentpositioninthestream.

ios::end

Seekfromtheendofthestream.第18頁(yè)/共45頁(yè)隨機(jī)存取文件隨機(jī)存取文件一種較容易的實(shí)現(xiàn)方式是保證文件中的所有記錄擁有相同長(zhǎng)度,即第19頁(yè)/共45頁(yè)成員函數(shù)write和readwrite函數(shù)原型ostream::write(charconst*,int)從內(nèi)存指定位置輸出固定數(shù)目的字節(jié)到指定的瀏Write在文件中從“put”文件定位指針指定的位置開(kāi)始寫(xiě)入數(shù)據(jù)read函數(shù)原型istream::read(char*,int)在文件中由get文件定位指針?biāo)付ǖ奈恢米x取字節(jié)數(shù)據(jù)2023/1/17第20頁(yè)/共45頁(yè)隨機(jī)文件的寫(xiě)入#ifndefCLIENT_H#defineCLIENT_H#include<string>usingnamespacestd;classClient{public: Client(intidValue=0,stringnameString="",doublebalanceValue=0.0) { id(idValue); name(nameString); balance(balanceValue); } intid()const{return_id;} stringname(){return_name;} doublebalance()const{return_balance;} voidid(intidValue){_id=idValue;} voidname(stringnameString){strcpy(_name,nameString.c_str());} voidbalance(doublebalanceValue){_balance=balanceValue;}protected: int_id;

char_name[20]; double_balance;};#endif第21頁(yè)/共45頁(yè)#include<iostream>#include<iomanip>#include<fstream>#include"Clinet.h"#include<cstdlib>usingnamespacestd;intmain(){ intid; stringname; doublebalance; ofstreamoutCredit("Credit.dat",ios::out|ios::binary); if(!outCredit) { cerr<<"Filecannotbeopened."<<endl; exit(EXIT_FAILURE); }第22頁(yè)/共45頁(yè)cout<<"Enterid(1to100,0toendinput)\n?"; Clientclient; cin>>id; while(id>0&&id<=100) { cout<<"Enternamebalance:\n"; cin>>name; cin>>balance; client.id(id); (name); client.balance(balance); outCredit.seekp((client.id()-1)*sizeof(client)); outCredit.write(reinterpret_cast<constchar*>(&client),sizeof(client)); cout<<"Enterid:\n"; cin>>id; } return0;}第23頁(yè)/共45頁(yè)注意記錄的錄入順序是隨機(jī)的第24頁(yè)/共45頁(yè)詳解輸出操作符<<<<是雙目運(yùn)算符,采用左結(jié)合性,語(yǔ)法格式:輸出流對(duì)象<<C++內(nèi)置數(shù)據(jù)類(lèi)型輸出表達(dá)式的計(jì)算結(jié)果是<<的左操作數(shù),也就是說(shuō)表達(dá)式的結(jié)果經(jīng)常是cout自己endl是ostream操作符,它把一個(gè)換行符插入到流中,然后再刷新ostream緩沖區(qū)ends是ostream操作符,它向標(biāo)準(zhǔn)輸出流輸出空字符flush是ostream操作符,它用于清空輸出緩沖區(qū)ws是ostream操作符,它讀取并丟棄輸出流中的空白字符(空格、回車(chē)、換行、制表符、走紙符)第25頁(yè)/共45頁(yè)詳解輸入操作符>>>>是雙目運(yùn)算符,采用左結(jié)合性,語(yǔ)法格式:輸入流對(duì)象>>C++內(nèi)置數(shù)據(jù)類(lèi)型一般情況下,輸入操作符在輸入多個(gè)數(shù)據(jù)時(shí),會(huì)丟棄空白符號(hào)當(dāng)遇到文件結(jié)束或者無(wú)效值時(shí),cin的值為false第26頁(yè)/共45頁(yè)確保輸入的健壯性#include<iostream>usingnamespacestd;intmain(){intx;cin>>x;if(!cin)//若輸入無(wú)效,cin返回false

{ cerr<<"inputwrongdata!"<<endl; return1; } cout<<x<<endl;return0;}第27頁(yè)/共45頁(yè)C++中字符串的輸入#include<iostream>usingnamespacestd;intmain(){ constintSIZE=80; charbuffer1[SIZE];charbuffer2[SIZE]; cout<<"Enterasentence:"<<endl;cin>>buffer1; cout<<"\nThestringreadwithcinwas:"<<endl<<buffer1<<endl<<endl;

cin.get(buffer2,SIZE);

cout<<"Thestringreadwithcin.getwas:"<<endl<<buffer2<<endl;return0;}第28頁(yè)/共45頁(yè)#include<iostream>usingnamespacestd;intmain(){ constintSIZE=80; charbuffer[SIZE];

cout<<"Enterasentence:"<<endl;

cin.getline(buffer,SIZE);

cout<<"\nThesentenceenteredis:"<<endl<<buffer<<endl; return0;}第29頁(yè)/共45頁(yè)說(shuō)明cin>>字符數(shù)組名當(dāng)遇到空白字符時(shí),終止讀入字符串cin.get(buffer,count,t)讀入count-1個(gè)字符到buffer中,當(dāng)遇到分隔符t時(shí),終止字符串讀入,默認(rèn)分隔符t是’\n’該函數(shù)將字符串末尾的空字符自動(dòng)插入buffer中cin.getline(buffer,count,t)讀入count-1個(gè)字符到buffer中,當(dāng)遇到分隔符t時(shí),終止字符串讀入該函數(shù)將輸入流中的分隔符刪除,且未將分隔符存儲(chǔ)于緩沖區(qū)中第30頁(yè)/共45頁(yè)請(qǐng)自行查閱以下函數(shù)用法peekputbackignore第31頁(yè)/共45頁(yè)重載<<和>>C++原有的>>和<<只能用于輸出和輸入原有的數(shù)據(jù)類(lèi)型,不能完成用戶(hù)自定義類(lèi)型如復(fù)數(shù)類(lèi)、分?jǐn)?shù)類(lèi)的輸入和輸出可以重載>>和<<運(yùn)算符,完成用戶(hù)自定義數(shù)據(jù)的輸入和輸出重載格式:ostream&operator<<(ostream&os,const用戶(hù)自定義類(lèi)型&c)第32頁(yè)/共45頁(yè)復(fù)數(shù)類(lèi)重載<<classComplex //復(fù)數(shù)類(lèi){public:Complex(doubler=0.0,doublei=0.0){real=r;image=i;}constdoubleReal(){returnreal;} constdoubleImag(){returnimage;}

friendComplexoperator+(constComplex&c1,constComplex&c2);friendComplexoperator-(constComplex&c1,constComplex&c2);

friendostream&operator<<(ostream&os,constComplex&c);friendistream&operator>>(istream&is,constComplex&c);Complex&operator=(constComplex&c);private:doublereal,image;};第33頁(yè)/共45頁(yè)ostream&operator<<(ostream&os,constComplex&c){ os<<'('<<c.real<<','<<c.image<<"i)"; returnos;}istream&operator>>(istream&is,constComplex&c){ is>>c.real>>c.image; returnis;}第34頁(yè)/共45頁(yè)intmain(){//定義一個(gè)復(fù)數(shù)對(duì)象c1,其實(shí)部為2,虛部為2.5Complexc1(2,2.5);Complexc2(3,1.4);Complexc3,c4;

c3=c1+c2;c4=c1-c2;

cout<<c3<<endl;//重載operator<< cout<<c4<<endl; return0;}第35頁(yè)/共45頁(yè)按進(jìn)制顯示數(shù)#include<iostream>usingnamespacestd;voidmain(){ intival=16; doubledval=16.0; cout<<"ival:"<<ival <<"octset:"<<oct<<ival<<"\n"; cout<<"dval:"<<dval <<"hexset:"<<hex<<dval<<"\n"; cout<<"ival:"<<ival <<"decset:"<<dec<<ival<<"\n";}第36頁(yè)/共45頁(yè)浮點(diǎn)精度#include<iostream>#include<iomanip>#include<cmath>usingnamespacestd;intmain(){doubleroot2=sqrt(2.0); intplaces; cout<<"Squarerootof2withprecisions0-9."<<endl <<"Precisionsetbyios_basememberfunctionprecision:\n";

cout<<fixed;//若改成cout<<scientific??? for(places=0;places<=9;places++) { cout.precision(places); cout<<root2<<endl; } cout<<"\nPrecisionsetbystreammanipulatorsetprecision:\n"; for(places=0;places<=9;places++) cout<<setprecision(places)<<root2<<endl;}第37頁(yè)/共45頁(yè)showpoint#include<iostream>usingnamespacestd;intmain(){ cout<<"Beforeusingshowpoint"<<endl <<"9.9900printas:"<<9.9900<<endl <<"9.9000printas:"<<9.9000<<endl <<"9.0000printas:"<<9.0000<<endl<<endl;

cout<<showpoint<<"afterusingshowpoint"<<endl <<"9.9900printas:"<<9.9900<<endl <<"9.9000printas:"<<9.9000<<endl <<"9.0000printas:"

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論