版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第14章輸入輸出與文件輸入輸出是指程序與外部設(shè)備交換信息C++把輸入輸出看成是一個數(shù)據(jù)流輸入流:外圍設(shè)備流向內(nèi)存的數(shù)據(jù)輸出流:內(nèi)存流向外圍設(shè)備的數(shù)據(jù)在C++中,輸入輸出不是語言所定義的部分,而是由標(biāo)準(zhǔn)庫提供。C++的輸入輸出分為:基于控制臺的I/O基于文件的I/O基于字符串的I/O輸入輸出與文件流與標(biāo)準(zhǔn)庫輸入輸出緩沖基于控制臺的I/O基于文件的I/O基于字符串的I/O流的概念及用途
I/O操作是以對數(shù)據(jù)類型敏感的方式執(zhí)行的。C++的I/O操作是以字節(jié)流的形式實現(xiàn)的。流實際上就是字節(jié)序列。C++提供了低級和高級I/O功能。低級I/O功能通常只在設(shè)備和內(nèi)存之間傳輸一些字節(jié)。高級I/O功能把若干個字節(jié)組合成有意義的單位,如整數(shù)、浮點數(shù)、字符、字符串以及用戶自定義類型的數(shù)據(jù)。C++提供了無格式I/O和格式化I/O兩種操作。無格式I/O傳輸速度快,但使用起來較為麻煩。格式化I/O按不同的類型對數(shù)據(jù)進行處理,但需要增加額外的處理時間,不適于處理大容量的數(shù)據(jù)傳輸。流與標(biāo)準(zhǔn)庫頭文件類型iostreamistream從流中讀取ostream寫到流中去iostream對流進行讀寫,從istream和ostream派生fstreamifstream從文件中讀取,由istream派生而來ofstream寫到文件中去,由ostream派生而來fstream對流進行讀寫,由iostream派生而來sstreamistringstream從string對象中讀取,由istream派生而來ostringstream寫到string對象中去,由ostream派生而來stringstream對string對象進行讀寫,由iostream派生而來類的繼承關(guān)系iosistreamostreamifstreamofstreamiostreamfstreamistringstreamostringstreamstringstream輸入輸出與文件流與標(biāo)準(zhǔn)庫輸入輸出緩沖基于控制臺的I/O基于文件的I/O基于字符串的I/O輸入輸出緩沖C++的輸入輸出是基于緩沖實現(xiàn)的每個I/O對象管理一個緩沖區(qū),用于存儲程序讀寫的數(shù)據(jù)當(dāng)用戶在鍵盤上輸入數(shù)據(jù)時,鍵盤輸入的數(shù)據(jù)是存儲在輸入緩沖區(qū)中,當(dāng)執(zhí)行“>>”操作時,從輸入緩沖區(qū)中取數(shù)據(jù)存入變量,如緩沖區(qū)中無數(shù)據(jù),則等待從外圍設(shè)備取數(shù)據(jù)放入緩沖區(qū)“<<”是將數(shù)據(jù)放入輸出緩沖區(qū)。如有下列語句:os<<“pleaseenterthevalue:”;系統(tǒng)將字符串常量存儲在與流os關(guān)聯(lián)的緩沖區(qū)中輸出緩沖區(qū)的刷新程序正常結(jié)束。作為main函數(shù)返回工作的一部分,將真正輸出緩沖區(qū)的內(nèi)容,清空所有的輸出緩沖區(qū);當(dāng)緩沖區(qū)已滿時,在寫入下一個值之前,會刷新緩沖區(qū);用標(biāo)準(zhǔn)庫的操縱符,如行結(jié)束符endl,顯式地刷新緩沖區(qū);在每次輸出操作執(zhí)行結(jié)束后,用unitbuf操縱符設(shè)置流的內(nèi)部狀態(tài),從而清空緩沖區(qū);可將輸出流與輸入流關(guān)聯(lián)起來。在這種情況下,在讀輸入流時,將刷新其關(guān)聯(lián)的輸出緩沖區(qū)。在標(biāo)準(zhǔn)庫中,將cout和cin關(guān)聯(lián)在一起,因此每個輸入操作都將刷新cout關(guān)聯(lián)的緩沖區(qū)。輸入輸出與文件流與標(biāo)準(zhǔn)庫輸入輸出緩沖基于控制臺的I/O基于文件的I/O基于字符串的I/O基于控制臺的I/O標(biāo)準(zhǔn)的輸入輸出流對象cin是類istream的對象,它與標(biāo)準(zhǔn)輸入設(shè)備(通常指鍵盤)連在一起。cout是類ostream的對象,它與標(biāo)準(zhǔn)輸出設(shè)備(通常指顯示設(shè)備)連在一起。cerr是類osteam的對象,它與標(biāo)準(zhǔn)錯誤輸出設(shè)備連在一起。
clog是類ostream的對象,它與標(biāo)準(zhǔn)錯誤輸出設(shè)備連在一起?;诳刂婆_的I/O輸出流輸入流格式化輸入/輸出輸出流C++的類ostream提供了格式化輸出和無格式輸出的功能輸出功能包括用流插入運算符輸出標(biāo)準(zhǔn)類型的數(shù)據(jù);用成員函數(shù)put輸出字符;成員函數(shù)write的無格式化輸出;輸出特定形式數(shù)值輸出標(biāo)準(zhǔn)類型的數(shù)據(jù)標(biāo)準(zhǔn)類型的數(shù)據(jù)用流插入運算符<<輸出格式:cout<<數(shù)據(jù)項;C++能自動判別數(shù)據(jù)類型,并根據(jù)數(shù)據(jù)類型解釋內(nèi)存單元的信息,把它轉(zhuǎn)換成字符顯示在顯示器上。
輸出流#include<iostream>usingnamespacestd;intmain(){inta=5,*p=&a;doublex=1234.56;charch='a';cout<<"a="<<a<<endl;cout<<"x="<<x<<endl;cout<<"ch="<<ch<<endl;
cout<<"*p="<<*p<<endl;cout<<"p="<<p<<endl;
return0;}a=5x=1234.56ch=a*p=5p=0012FF7C地址用十六進制輸出指針輸出的特例如果輸出的指針變量是一個指向字符的指針時,C++并不輸出該指針中保存的地址,而是輸出該指針指向的字符串。如果確實想輸出這個指向字符的指針變量中保存的地址值,可以用強制類型轉(zhuǎn)換,將它轉(zhuǎn)換成void*類型#include<iostream>usingnamespacestd;intmain(){char*ptr="abcdef";cout<<"ptr指向的內(nèi)容為:"<<ptr<<endl;cout<<"ptr中保存的地址為:"<<(void*)ptr<<endl;
return0;}ptr指向的內(nèi)容為:abcdefptr中保存的地址為:0046C04C用成員函數(shù)put輸出字符cout.put(‘A’);
將字符A顯示在屏幕上,并返回當(dāng)前對象。
連續(xù)調(diào)用put函數(shù):
cout.put(‘A’).put(‘\n’);
該語句在輸出字符A后輸出一個換行符。圓點運算符(.)從左向右結(jié)合。cout.put(65);用ASCII碼值表達式調(diào)用put函數(shù),語句也輸出字符A。write的無格式輸出
調(diào)用成員函數(shù)write可實現(xiàn)無格式輸出。它有兩個參數(shù)。第一個參數(shù)是一個指向字符的指針,第二個參數(shù)是一個整型值。這個函數(shù)把一定量的字節(jié)從字符數(shù)組中輸出。這些字節(jié)都是未經(jīng)任何格式化的,僅僅是以原始數(shù)據(jù)形式輸出。
例如:
charbuffer[]
=“HAPPYBIRTHDAY”;
cout.write(buffer,10
);
輸出buffer的10個字節(jié)函數(shù)調(diào)用:
cout.write(“ABCDEFGHIJKLMNOPQRSTUVWXYZ”,10);
顯示了字母表中的前10個字母。
基于控制臺的I/O輸出流輸入流格式化輸入/輸出輸入流流讀取運算符>>Get函數(shù)Getline函數(shù)其他函數(shù)流讀取運算符>>輸入流最常用的操作是流讀取運算符。流讀取運算符通常會跳過輸入流中的空格、tab鍵、換行符等空白字符。當(dāng)遇到輸入流中的文件結(jié)束符時,流讀取運算符返回0(false);否則,流讀取運算符返回對調(diào)用該運算符的對象的引用。流讀取運算符在讀入EOF時返回0的特性使得它經(jīng)常被用作為循環(huán)的判別條件,以避免選擇特定的表示輸入結(jié)束的值EOF在各個系統(tǒng)中有不同的表示。在windows中是Ctri+z實例統(tǒng)計某次考試的最高成績。假定事先不知道有多少個考試成績,在輸入結(jié)束時用戶會輸入表示成績輸入完畢的文件結(jié)束符。當(dāng)用戶輸入文件結(jié)束符時,while循環(huán)結(jié)構(gòu)中的條件(cin>>grade)將變?yōu)?(即false)。#include<iostream>usingnamespacestd;intmain(){intgrade,highestGrade=-1;cout<<"Entergrade(enterend-of-filetoend):";while(cin>>grade){if(grade>highestGrade)highestGrade=grade;cout<<"Entergrade(enterend-of-filetoend):";}cout<<"\n\nHighestgradeis:"<<highestGrade<<endl;return0;}
輸出結(jié)果:
Entergrade(enterend-of-filetoend):67
Entergrade(enterend-of-filetoend):87
Entergrade(enterendoffiletoend):73
Entergrade(enterend-of-filetoend):95
Entergrade(enterend-of-filetoend):34
Entergrade(enterend-of-filetoend):99
Entergrade(enterend-of-filetoend):
^z
Heighestgradeis:99成員函數(shù)getGet函數(shù)用于讀入字符或字符串get函數(shù)有三種格式:不帶參數(shù)帶一個參數(shù)帶三個參數(shù)不帶參數(shù)的get函數(shù)不帶參數(shù)的get函數(shù)從當(dāng)前對象讀入一個字符,包括空白字符以及表示文件結(jié)束的EOF,并將讀入值作為函數(shù)的返回值返回。如下列語句while((ch=cin.get())!=EOF)cout<<ch;將輸入的字符回顯在顯示器上,直到輸入EOF。#include<iostream>Usingnamespacestd;
intmain()
{charc;
while((c=cin.get())!=EOF)
cout.put(c);
cout<<"\nEOFinthissystemis:"<<c;
return0;
}輸出結(jié)果:
Enterasentencefollowedbyend-of-file:
Testingthegetandputmemberfunctions^z
Testingthegetandputmemberfunctions
EOFinthissystemis:-1
帶一個參數(shù)的get函數(shù)例如,下面的循環(huán)語句將輸入一個字符串,存入字符數(shù)組ch,直到輸入回車。cin.get(ch[0]);for(i=0;ch[i]!='\n';++i)cin.get(ch[i+1]);ch[i]='\0';帶一個字符類型的引用參數(shù),它將輸入流中的下一字符(包括空白字符)存儲在參數(shù)中,它的返回值是當(dāng)前對象的引用。帶有三個參數(shù)的get成員函數(shù)參數(shù)分別是接收字符的字符數(shù)組、字符數(shù)組的大小和分隔符(默認(rèn)值為‘\n’)。函數(shù)或者在讀取比指定的最大字符數(shù)少一個字符后結(jié)束,或者在遇到分隔符時結(jié)束。為使字符數(shù)組(被程序用作緩沖區(qū))中的輸入字符串能夠結(jié)束,空字符會被插入到字符數(shù)組中。函數(shù)不把分隔符放到字符數(shù)組中,但是分隔符仍然會保留在輸入流中。要輸入一行字符,可用下列語句:cin.get(ch,80,’\n’);或cin.get(ch,80);要輸入一個以句號結(jié)尾的句子,可用下面的語句:cin.get(ch,80,’.’);當(dāng)遇到輸入結(jié)束符時,程序插入一個’\0’作為輸入字符串的結(jié)束標(biāo)記,輸入結(jié)束符沒有放在字符數(shù)組中,而是保留在輸入流中,下一個和輸入相關(guān)的語句會讀入這個輸入結(jié)束符。如對應(yīng)于語句cin.get(ch,80,’.’);用戶輸入abcdef.↙則ch中保存的是字符串“abcdef”,而“.”仍保留在輸入緩沖區(qū)中。如果繼續(xù)調(diào)用cin.get(ch1);或cin>>ch1
;則字符變量ch1中保存的是“.”。#include<iostream>Usingnamespacestd;
intmain()
{
constintSIZE=80;
charbuffer1[SIZE],buffer2[SIZE];
cout<<"Enterasentence:\n";
cin>>buffer1;
cout<<"\nThestringreadwithcinwas:\n"
<<buffer1<<"n\n";
cin.get(buffer2,SIZE);
cout<<"Thestringreadwithcin.getwas:\n"
<<buffer2<<endl;
return0;
}輸出結(jié)果:
Enterasentence:
Contrastingstringinputwithcinandcin.get
Thestringreadwithcinwas:
Contrasting
Thestringreadwithcin.getwas:
stringinputwithcinandcin.get
成員函數(shù)getline與帶三個參數(shù)的get函數(shù)類似,它讀取一行信息到字符數(shù)組中,然后插入一個空字符。所不同的是,getline要去除輸入流中的分隔符(即讀取字符并刪除它),但是不把它存放在字符數(shù)組中。#include<iostream>Usingnamespacestd;
intmain()
{constSIZE=80;
charbuffe[SIZE];
cout<<"Enterasentence:\n";
cin.getline(buffer,SIZE);
cout<<"\nThesentenceenteredis:\n"<<buffer<<endl;
return0;
}輸出結(jié)果:
Enterasentence:
Usingthegetlinememberfunction
Thesentenceenteredis:
Usingthegetlinememberfunction
用Read函數(shù)輸入調(diào)用成員函數(shù)read可實現(xiàn)無格式輸入。它有兩個參數(shù)。第一個參數(shù)是一個指向字符的指針,第二個參數(shù)是一個整型值。這個函數(shù)把一定量的字節(jié)從輸入緩沖區(qū)讀入字符數(shù)組,不管這些字節(jié)包含的是什么內(nèi)容。
例如:
charbuffer[80];
cin.read(buffer,10
);
讀入10個字節(jié),放入buffer如果還沒有讀到指定的字符數(shù),遇到了EOF,則讀操作結(jié)束。此時可以用成員函數(shù)gcount統(tǒng)計輸入的字符個數(shù)#include<iostream>usingnamespacestd;intmain(){charbuffer[80];cout<<"Enterasentence:\n";cin.read(buffer,20);cout<<"\nThesentenceenteredwas:\n";cout.write(buffer,cin.gcount());cout<<endl;cout<<"一共輸入了"<<cin.gcount()<<"個字符\n";return0;}
輸出結(jié)果:
Enterasentence:
Usingtheread,write,andgcountmemberfunctions
Thesentenceenteredwas:
Usingtheread,write一共輸入了20個字符基于控制臺的I/O輸出流輸入流格式化輸入/輸出格式化輸入/輸出C++提供了大量的用于執(zhí)行格式化輸入/輸出的流操縱算子和成員函數(shù)。功能:整數(shù)流的基數(shù):dec、oct、hex和setbase設(shè)置浮點數(shù)精度:precision、setprecision設(shè)置域?qū)?setw、width設(shè)置域填充字符:fill、setfill設(shè)置整型數(shù)的基數(shù)輸入輸出流中的整型數(shù)默認(rèn)為十進制表示。為了使流中的整型數(shù)不局限于十進制,可以插入hex操縱符將基數(shù)設(shè)為十六進制,插入oct操縱符將基數(shù)設(shè)為八進制,也可以插入dec操縱符將基數(shù)重新設(shè)為十進制也可以通過流操縱符setbase來改變流的基數(shù)。該操縱符有一個整型參數(shù),它的值可以是16,10或8,表示將整型數(shù)的基數(shù)設(shè)為十六進制,十進制或八進制使用任何帶參數(shù)的流操縱符,都必須包含頭文件iomanip流的基數(shù)值只有被顯式更改時才會變化,否則一直沿用原有的基數(shù)。hex、oct、dec和setbase#include<iostream>#include<iomanip>usingnamespacestd;intmain(){intn;cout<<"Enteraoctalnumber:";cin>>oct>>n;cout<<"octal"<<oct<<n<<"inhexdecimalis:"<<hex<<n<<'\n';
cout<<"hexdecimal"<<n<<"indecimalis:"<<dec<<n<<'\n';cout<<setbase(8)<<"octal"<<n<<"inoctalis:"<<n<<endl;return0;}Enteraoctalnumber:30Octal30inhexdecimalis:18Hexdecimal18indecimalis:24Octal30inoctalis:30設(shè)置浮點數(shù)精度設(shè)置浮點數(shù)的精度(即,實型數(shù)的有效位數(shù))可以用流操縱符setprecision或基類ios的成員函數(shù)precision來實現(xiàn)。一旦調(diào)用了這兩者之中的某一個,將影響所有輸出的浮點數(shù)的精度,直到下一個設(shè)置精度的操作為止。這個操縱符和成員函數(shù)都有一個參數(shù),表示有效位數(shù)的長度。#include<iostream>#include<iomanip>usingnamespacestd;intmain(){doublex=123.456789,y=9876.54321;
for(inti=9;i>0;--i){cout.precision(i);cout<<x<<'\t'<<y<<endl;}//或?qū)懗蒮or(inti=9;i>0;--i)//cout<<setprecision(i)<<x<<'\t'<<y<<endl;
return0;}執(zhí)行結(jié)果123.4567899876.54321123.456799876.5432123.45689876.543123.4579876.54123.469876.5123.598771239.88e+0031.2e+0029.9e+0031e+0021e+004設(shè)置域?qū)捰驅(qū)捠侵笖?shù)據(jù)所占的字符個數(shù)。設(shè)置域?qū)捒梢杂没惖某蓡T函數(shù)width,也可以用流操縱符(setw)。width和setw都包含一個整型的參數(shù),表示域?qū)?。設(shè)置域?qū)捒捎糜谳斎?,也可用于輸出。設(shè)置寬度是適合于下一次輸入或輸出,之后的操作的寬度將被設(shè)置為默認(rèn)值。當(dāng)沒有設(shè)置輸出寬度時,C++按實際長度輸出。如整型變量a=123,b=456,則輸出cout<<a<<b;將輸出123456。一旦設(shè)置了域?qū)?,該輸出必須占滿域?qū)?。如果輸出值的寬度比域?qū)捫。瑒t插入填充字符填充。默認(rèn)的填充字符是空格。如果實際寬度大于指定的域?qū)?,則按實際寬度輸出。如語句cout<<setw(5)<<x<<setw(5)<<y<<endl;的輸出為123456每個數(shù)值占5個位置,前面用空格填充。設(shè)置域?qū)捯部捎糜谳斎搿.?dāng)輸入是字符串時,如果輸入的字符個數(shù)大于設(shè)置的域?qū)挄r,C++只讀入域?qū)捴付ǖ淖址麄€數(shù)。如有定義chara[9],b[9];執(zhí)行語句cin>>setw(5)>>a>>setw(5)>>b;用戶在鍵盤上的響應(yīng)為abcdefghijklm則字符串a(chǎn)的值為“abcd”,字符串b的值為“defg”。其他流操縱符流操縱符描述skipws跳過輸入流中的空白字符,使用流操縱符noskipws復(fù)位該選項left輸出左對齊,必要時在右邊填充字符right輸出右對齊,必要時在左邊填充字符showbase指名在數(shù)字的前面輸出基數(shù),以0開頭表示八進制,0x或0X表示十六進制。使用流操縱符noshowbase復(fù)位該選擇uppercase指明當(dāng)顯示十六進制數(shù)時使用大寫字母,并且在科學(xué)計數(shù)法輸出時使用大寫字母E??梢杂昧鞑倏v符nouppercase復(fù)位showpos在正數(shù)前顯示加號(+),可以用流操縱符noshowpos復(fù)位scientic以科學(xué)計數(shù)法輸出浮點數(shù)fixed以定點小數(shù)形式輸出浮點數(shù)setfill設(shè)置填充字符,它有一個字符型的參數(shù)用戶自定義的流操縱算子程序員可以定義自己的流操縱符例如,定義輸出流操縱符格式如下:ostream&操縱符名(ostream&os){需要執(zhí)行的操作}#include<iostream>usingnamespacestd;ostream&tab(ostream&os){returnos<<'\t';}intmain(){inta=5,b=7;cout<<a<<tab<<b<<endl;return0;}57輸入輸出與文件流與標(biāo)準(zhǔn)庫輸入輸出緩沖基于控制臺的I/O基于文件的I/O基于字符串的I/O基于文件的I/O文件的概念文件和流文件的順序訪問文件的隨機訪問訪問有記錄概念的文件文件的概念文件是駐留在外存儲器上、具有標(biāo)識名的一組信息集合,用來永久保存數(shù)據(jù)。與文件相關(guān)的概念有:數(shù)據(jù)項(字段)記錄文件數(shù)據(jù)庫如在一個圖書管理系統(tǒng)中,有一個數(shù)據(jù)庫。這個數(shù)據(jù)庫由書目文件、讀者文件及其它輔助文件組成。書目文件中保存的是圖書館中的所有書目信息,每本書的信息構(gòu)成一條記錄。每本書需要保存的信息有:書名、作者、出版年月、分類號、ISBN號、圖書館的館藏號以及一些流通信息。其中書名是一個字段,作者也是一個字段?;谖募腎/O文件的概念文件和流文件的順序訪問文件的隨機訪問訪問有記錄概念的文件文件和流C++語言把每一個文件都看成一個有序的字節(jié)流(把文件看成n個字節(jié))每一個文件以文件結(jié)束符(end-of-filemarker)結(jié)束當(dāng)打開一個文件時,該文件就和某個流關(guān)聯(lián)起來與這些對象相關(guān)聯(lián)的流提供程序與特定文件或設(shè)備之間的通信通道例如.cin對象(標(biāo)準(zhǔn)輸入流對象)使程序能從鍵盤輸入數(shù)據(jù),cout對象(標(biāo)準(zhǔn)輸出流對象)使程序能向屏幕輸出數(shù)據(jù)。文件訪問過程定義一個流對象打開文件:將流對象與文件關(guān)聯(lián)起來訪問文件關(guān)閉文件:切斷流對象與文件的關(guān)聯(lián)定義一個流對象C++有三個文件流類型:ifstream:輸入文件流ofstream:輸出文件流fstream:輸入輸出文件流如:ifstreaminfile;打開文件用流對象的成員函數(shù)open打開文件用流對象的構(gòu)造函數(shù)打開文件無論是成員函數(shù)open還是通過構(gòu)造函數(shù),都有兩個參數(shù):打開的文件名文件打開模式如果文件打開失敗,返回0文件打開模式文件打開模式名含義in打開文件,做讀操作out打開文件,做寫操作app在每次寫操作前,找到文件尾ate打開文件后,立即將文件定位在文件尾trunc打開文件時,清空文件binary以二進制模式進行輸入輸出操作默認(rèn)打開方式ifstream流對象是以in模式打開ofstream流關(guān)聯(lián)的文件則以out模式打開ofstream對象以in和out方式打開文件打開打開輸入文件:ifstreaminfile;infile.open(“file1”);或infile.open(“file1”,ifstream::in);也可以利用構(gòu)造函數(shù)直接打開:ifstreaminfile(“file1”);或ifstreaminfile(“file1”,ifstream::in);打開輸出文件ofstreamoutfile;outfile.open(“file2”);或outfile.open(“file2”,ofstream::out);也可以利用構(gòu)造函數(shù)直接打開:ofstreamoutfile(“file2”);或ofstreamoutfile(“file2”,ofstream::out);打開輸入輸出文件fstreamiofile(“file3”);fstreamiofile(“file3”,fstream::in|fstream::out);文件關(guān)閉用成員函數(shù)closemain函數(shù)執(zhí)行結(jié)束時,會關(guān)閉所有打開的文件良好的程序設(shè)計習(xí)慣:文件訪問結(jié)束時,關(guān)閉文件基于文件的I/O文件的概念文件和流文件的順序訪問文件的隨機訪問訪問有記錄概念的文件文件的順序訪問C++文件的讀寫和控制臺讀寫一樣,可以用流提取運算符“>>”從文件讀數(shù)據(jù),也可以用流插入運算符”<<”將數(shù)據(jù)寫入文件,也可以用文件流的其他成員函數(shù)讀寫文件,如get函數(shù),put函數(shù)等。在讀文件操作中,經(jīng)常需要判斷文件是否結(jié)束(文件中的數(shù)據(jù)是否被讀完)。這可以通過基類ios的成員函數(shù)eof來實現(xiàn)。eof函數(shù)不需要參數(shù),返回一個整型值。當(dāng)讀操作遇到文件結(jié)束時,該函數(shù)返回1,否則返回0。另一種判斷讀結(jié)束的方法是用流提取操作的返回值。當(dāng)“>>”操作成功時,返回true。文件訪問實例將數(shù)字1到10寫入文件file,然后從file中讀取這些數(shù)據(jù),把它們顯示在屏幕上。首先用輸出方式打開文件file。如文件file不存在,則自動創(chuàng)建一個,否則打開磁盤上的文件,并清空。用一個循環(huán)依次將1到10用流插入符插入文件,并關(guān)閉文件。然后,再用輸入方式打開文件file,讀出所有數(shù)據(jù),并輸出到屏幕上。#include<iostream>#include<fstream>usingnamespacestd;intmain(){ofstreamout("file");ifstreamin;inti;if(!out){cerr<<"createfileerror\n";return1;}for(i=1;i<=10;++i)out<<i<<'';out.close();in.open("file");if(!in){cerr<<"openfileerror\n";return1;}while(in>>i)cout<<i<<'';
in.close();return0;}執(zhí)行結(jié)果執(zhí)行該程序后,文件file中的內(nèi)容為12345678910該程序的輸出結(jié)果是12345678910包含各種類型數(shù)據(jù)的文件操作#include<fstream>#include<iostream>usingnamespacestd;intmain(){ofstreamfout("test");if(!fout){cerr<<"cannotopenoutputfile\n";return1;}fout<<10<<""<<123.456<<"\"Thisisatextfile\"\n";
fout.close();return0;}執(zhí)行結(jié)果文件中的內(nèi)容為10123.456"Thisisatextfile"讀文件#include<fstream>#include<iostream>usingnamespacestd;intmain(){ifstreamfin("test");chars[80];inti;floatx;if(!fin){cout<<"cannotopeninputfile\n";return1;}fin>>i>>x>>s;cout<<i<<""<<x<<s;fin.close();
return0;}10123.456"Thisfin>>i>>x;fin.getline(s,80,‘\n’);基于文件的I/O文件的概念文件和流文件的順序訪問文件的隨機訪問訪問有記錄概念的文件文件定位指針文件定位指針:是一個long類型的數(shù)據(jù),指出當(dāng)前讀寫的位置C++文件有兩個定位指針:讀指針和寫指針當(dāng)文件以輸入方式打開時,讀指針指向文件中的第一個字節(jié)。文件以輸出方式打開時,寫指針指向文件中的第一個字節(jié)。當(dāng)文件以添加方式打開時,寫指針指向文件尾。文件的隨機訪問指定文件定位指針的值,從任意指定位置開始讀寫獲取文件定位指針的當(dāng)前位置:成員函數(shù)tellg和tellp設(shè)置文件定位指針的位置:成員函數(shù)seekg和seekp成員函數(shù)seekg和seekpseekg和seekp都有兩個參數(shù):第一個參數(shù)通常為long類型的整數(shù),表示偏移量;第二個參數(shù)指定移動的起始位置尋找方向:ios::beg(默認(rèn)):相對于流的開頭ios::cur:相對于流當(dāng)前位置ios::end:相對于流結(jié)尾文件位置指針的例子
//positiontothenthbyteoffileObject
//assumesios::beg
fileObject.seekg(n);
//positionnbytesforwardinfileObject
fileObject.seekg(n,ios::cur);
//positionybytesbackfromendoffileObject
fileObject.seekg(y,ios::end);
//positionatendoffileObject
fileObject.seekg(0,ios::end);隨機讀寫實例#include<iostream>#include<fstream>usingnamespacestd;intmain(){fstreamin("file");inti;
if(!in){cerr<<"openfileerror\n";return1;}in.seekp(10);in<<20;in.seekg(0);while(in>>i)cout<<i<<'';in.close();return0;}執(zhí)行后:123452078910執(zhí)行前:12345678910基于文件的I/O文件的概念文件和流文件的順序訪問文件的隨機訪問訪問有記錄概念的文件訪問要求立即訪問到文件甚至大型文件中指定的記錄可以在不破壞其他數(shù)據(jù)的情況下把數(shù)據(jù)插入到隨機訪問文件中。也能在不重寫整個文件的情況下更新和刪除以前存儲的數(shù)據(jù)。實現(xiàn)考慮要求記錄長度是固定的。可以使用istream中的read函數(shù)和ostream中的write函數(shù)能夠做到。如number是整型變量寫入:outFile.write(reinterpret_cast<constchar*>(&number)),sizeof(number));讀出:inFile.read(reinterpret_cast<char*>(&number)),sizeof(number));實例:圖書館的書目管理系統(tǒng)如果每本書需要記錄的信息有:館藏號(整型數(shù)):要求自動生成書名(最長20個字符的字符串)借書標(biāo)記。借書標(biāo)記中記錄的是借書者的借書證號,假設(shè)也是整型數(shù)。該系統(tǒng)需要實現(xiàn)的功能有:初始化系統(tǒng)添加書借書還書顯示書庫信息文件設(shè)計設(shè)計一個文件book,該文件中的每個記錄保存一本書的信息。文件中的記錄可按館藏號的次序存放,這樣可方便實現(xiàn)添加書和借還書的功能。添加書時,只要將這本書對應(yīng)的記錄添加到文件尾。借還書時,可以根據(jù)館藏號計算記錄的存儲位置,修改相應(yīng)的記錄。book類設(shè)計數(shù)據(jù)成員:館藏號、書名、借書標(biāo)記為了提供館藏號自動生成,需要保存系統(tǒng)中最大的館藏號。這個值可以作為書目類的靜態(tài)成員。成員函數(shù):構(gòu)造函數(shù)借書還書顯示書的詳細信息靜態(tài)成員初始化靜態(tài)成員值加1
Book.h#ifndef_book_h#define_book_h#include<cstring>#include<iostream>#include<iomanip>#include<fstream>usingnamespacestd;classbook{ intno; charname[20]; intborrowed; staticintno_total;public:book(constchar*s=""){no=no_total;borrowed=0;strcpy(name,s);}voidborrow(intreaderNo)//借書{if(borrowed!=0)cerr<<"本書已被借,不能重復(fù)借\n";elseborrowed=readerNo;}voidReturn(){//還書if(borrowed==0)cerr<<"本書沒有被借,不能還\n";elseborrowed=0; }
voiddisplay()//顯示書的信息{cout<<setw(10)<<no<<setw(20)<<name<<setw(10)<<borrowed<<endl;}staticvoidresetTotal(){no_total=0;}//最大館藏號復(fù)位staticvoidaddTotal(){++no_total;}//館藏號加1};intbook::no_total=0;//靜態(tài)數(shù)據(jù)成員的定義#endif系統(tǒng)分解系統(tǒng)可分解成五大功能,每個功能用一個函數(shù)實現(xiàn)。Main函數(shù)顯示菜單,根據(jù)用戶的選擇調(diào)用相應(yīng)的函數(shù)Main函數(shù)#include"book.h"voidinitialize();//系統(tǒng)初始化voidaddBook();//添加新書voidborrowBook();//借書voidreturnBook();//還書voiddisplayBook();//顯示所有的書目信息intmain(){intselector;while(true){ cout<<"0--退出\n"; cout<<"1--初始化文件\n"; cout<<"2--添加書\n"; cout<<"3--借書\n"; cout<<"4--還書\n"; cout<<"5--顯示所有書目信息\n"; cout<<"請選擇(0-5):";cin>>selector; if(selector==0)break; switch(selector) {case1:initialize();break; case2:addBook();break; case3:borrowBook();break; case4:returnBook();break; case5:displayBook();break; } }return0;}Initialize的實現(xiàn)voidinitialize(){ ofstreamoutfile("book");
book::resetTotal(); outfile.close();}addBook的實現(xiàn)voidaddBook(){ charch[20]; book*bp; ofstreamoutfile("book",ofstream::app); book::addTotal(); cout<<"請輸入書名:";cin>>ch;bp=newbook(ch);outfile.write(reinterpret_cast<constchar*>(bp),sizeof(*bp));
deletebp; outfile.close();}borrowBookvoidborrowBook(){intboo
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 合伙投資競業(yè)書合同
- 大班數(shù)學(xué)《坐船去探險》課件
- 手足口病風(fēng)趣幽默講解
- 2024房屋修繕合同
- 小學(xué)課外活動記錄20篇-20211116120635
- 2024新版家政保姆合同樣本
- 2024安置房買賣合同范本(標(biāo)準(zhǔn)版)
- 2024離婚合同協(xié)議書范本范文有子女
- 2024學(xué)校食堂租賃合同
- 2024新版影視劇攝制委托貸款合同
- (精心整理)書法田字格紙
- 小學(xué)數(shù)學(xué)北師大二年級上冊七分一分與除法快樂的動物(認(rèn)識倍)
- 牛人總結(jié)雅思7.5以上經(jīng)驗63大頁超詳細
- 礦山地質(zhì)環(huán)境保護和土地復(fù)墾方案 編制規(guī)范指南規(guī)范
- 口腔科醫(yī)療護理技術(shù)操作規(guī)程版
- 九年級心理健康教育教案 全冊
- 在例題與命題研究中實現(xiàn)教師專業(yè)成長
- 頭顱CT精美完整課件
- 安全總監(jiān)安全職責(zé)
- 附錄2.1-3培養(yǎng)目標(biāo)達成度評價報告修改
- 云南白族課件
評論
0/150
提交評論