《C++程序設(shè)計(jì)教程與實(shí)驗(yàn)指導(dǎo)》課件第8章 輸入輸出流_第1頁(yè)
《C++程序設(shè)計(jì)教程與實(shí)驗(yàn)指導(dǎo)》課件第8章 輸入輸出流_第2頁(yè)
《C++程序設(shè)計(jì)教程與實(shí)驗(yàn)指導(dǎo)》課件第8章 輸入輸出流_第3頁(yè)
《C++程序設(shè)計(jì)教程與實(shí)驗(yàn)指導(dǎo)》課件第8章 輸入輸出流_第4頁(yè)
《C++程序設(shè)計(jì)教程與實(shí)驗(yàn)指導(dǎo)》課件第8章 輸入輸出流_第5頁(yè)
已閱讀5頁(yè),還剩41頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第8章輸入/輸出流8.1輸入/輸出流概述8.2插入運(yùn)算符及提取運(yùn)算符8.3格式化輸入輸出8.4文件的輸入輸出8.5輸入輸出文件流fstream8.1輸入/輸出流概述8.1.1流的概念“流”是一種抽象的形態(tài),指的是計(jì)算機(jī)里的數(shù)據(jù)從一個(gè)對(duì)象流向另一個(gè)對(duì)象。這里數(shù)據(jù)流入和流出的對(duì)象通常是指計(jì)算機(jī)中的屏幕、內(nèi)存、文件等一些輸入輸出設(shè)備。數(shù)據(jù)的流動(dòng)就是由I/O流類(lèi)來(lái)實(shí)現(xiàn)的。如預(yù)定義流對(duì)象cin和cout實(shí)現(xiàn)的數(shù)據(jù)流動(dòng)過(guò)程:C++中的I/O流負(fù)責(zé)建立程序與設(shè)備對(duì)象之間的連接,它像一個(gè)橋梁,溝通了數(shù)據(jù)的產(chǎn)生者和消費(fèi)者,使他們之間產(chǎn)生數(shù)據(jù)的流動(dòng)。第8章輸入/輸出流內(nèi)存數(shù)據(jù)流顯示器流對(duì)象cout鍵盤(pán)數(shù)據(jù)流內(nèi)存流對(duì)象cin8.1輸入/輸出流概述8.1.2流類(lèi)庫(kù)的結(jié)構(gòu)

第8章輸入/輸出流ostreamiosistreamiftreamistrstreamistringstreamoftreamostrstreamostringstream

iostreamfstreamstrstreamstingstream第8章輸入/輸出流類(lèi)

名說(shuō)

明包含頭文件抽象流基類(lèi)ios所有輸入輸出流類(lèi)的基類(lèi)ios輸入流類(lèi)istream通用輸入流類(lèi)和其他輸入流的基類(lèi)iostreamifstream輸入文件流類(lèi)fstream輸出流類(lèi)ostream通用輸出流類(lèi)和其他輸出流的基類(lèi)iostreamofstream輸出文件流類(lèi)fstream輸入輸出流類(lèi)ostream通用輸入/輸出流類(lèi)和其他輸入/輸出流類(lèi)的基類(lèi)iostreamfstream輸入/輸出文件流類(lèi)fstreamI/O流類(lèi)說(shuō)明表8.1輸入/輸出流概述8.1.2流類(lèi)庫(kù)的結(jié)構(gòu)(續(xù))

流類(lèi)庫(kù)中與文件輸入輸出相關(guān)的文件流類(lèi)結(jié)構(gòu):第8章輸入/輸出流iosistreamostreamifstreamofstreamiostreamfstream

返回8.2插入運(yùn)算符與提取運(yùn)算符1.插入運(yùn)算符插入運(yùn)算符“<<”:通常用于插入數(shù)據(jù)到一個(gè)輸出流對(duì)象中,流對(duì)象再進(jìn)一步將數(shù)據(jù)輸出到它所關(guān)聯(lián)的設(shè)備中。

如:cout<<“HelloWorld!”插入運(yùn)算符“<<”適用于任何輸出流對(duì)象,如輸出文件流ofstream的對(duì)象等?!?lt;<”右側(cè)可以是任何標(biāo)準(zhǔn)數(shù)據(jù)類(lèi)型的變量及常量,也可以是字符串變量及常量。如:cout<<i<<‘s’<<3.14<<‘’<<f;

第8章輸入/輸出流8.2插入運(yùn)算符與提取運(yùn)算符2.提取運(yùn)算符

提取運(yùn)算符“>>”:通常用于從輸入流對(duì)象中提取數(shù)據(jù)。

如:inti;charbuf[100];cin>>i;cin>>buf;提取運(yùn)算符“>>”適用于任何輸入流對(duì)象,如輸入文件流ifstream的對(duì)象等?!?gt;>”右側(cè)可以是任意標(biāo)準(zhǔn)數(shù)據(jù)類(lèi)型的變量,也可以是字符串變量。

注意:使用提取運(yùn)算符“>>”提取數(shù)據(jù)時(shí),以空白符(如空格、回車(chē)、tab)作為數(shù)據(jù)的分割符,因此提取字符串?dāng)?shù)據(jù)時(shí),不能提取空白字符。第8章輸入/輸出流

返回8.3格式化輸入輸出C++中的I/O流可以完成輸出/輸入的格式化操作,如設(shè)置域?qū)?、設(shè)置精度及整數(shù)進(jìn)制等。設(shè)置輸入輸出格式的方法:使用流操縱元,只需把流操縱元插入(提?。┑捷敵隽鳎ㄝ斎肓鳎┲屑纯蓪?duì)輸出流(輸入流)進(jìn)行格式化,如setiosflags、setw、setfill、setprecision、hex、oct等,使用流操縱元時(shí)需在程序中包含頭文件iomanip通過(guò)流的成員函數(shù),即由流對(duì)象直接調(diào)用完成格式化,如setf、unsetf、width、fill、precision等。使用流成員函數(shù)的優(yōu)點(diǎn)是在設(shè)置格式同時(shí),可以返回以前的設(shè)置,便于恢復(fù)原來(lái)的設(shè)置。第8章輸入/輸出流8.3格式化輸入輸出8.3.1輸出寬度控制:setw和width使用流操縱元setw和成員函數(shù)width可以控制當(dāng)前域?qū)挘摧斎?輸出的字符數(shù))。注意:

(1)寬度的設(shè)置僅適用于下一個(gè)插入或讀取的數(shù)據(jù)。

(2)在輸出流中控制域?qū)?,如果輸出?shù)據(jù)的寬度比設(shè)置的域?qū)捫?,將以默認(rèn)右對(duì)齊方式輸出數(shù)據(jù),左邊空位會(huì)用填充字符來(lái)填充(填充字符默認(rèn)是空格)。

(3)如果輸出數(shù)據(jù)的寬度比設(shè)置的寬度大,數(shù)據(jù)不會(huì)被截?cái)?,將輸出所有位?shù)。第8章輸入/輸出流例8.1使用setw操縱元控制域?qū)?include<iostream>#include<iomanip>usingnamespacestd;voidmain(){ cout<<123<<endl; cout<<setw(5)<<4.5<<6.7<<endl;}

程序運(yùn)行結(jié)果為:1234.56.7第8章輸入/輸出流域?qū)拑H適用于下一個(gè)數(shù)據(jù);實(shí)際數(shù)據(jù)比設(shè)置的域?qū)捫?,將右?duì)齊,左補(bǔ)空格例8.2使用width成員函數(shù)控制域?qū)?include<iostream>usingnamespacestd;voidmain(){ char*str[3]={“abc”,“abcde”,“abcdef”}; for(inti=0;i<3;i++) {

cout.width(5);cout<<str[i]<<endl; }}

程序運(yùn)行結(jié)果為:abcabcdeabcdef第8章輸入/輸出流8.3格式化輸入輸出8.3.2填充字符控制:setfill和fill

在缺省情況下,如果域?qū)挻笥跀?shù)據(jù)寬度時(shí),填充多余空間的字符是空格。如果要改變填充字符,可以使用流操縱元setfill和成員函數(shù)fill。

注意:設(shè)置了填充字符后,將對(duì)程序后面的輸出代碼產(chǎn)生永久影響,直到下一次再改變填充字符為止。第8章輸入/輸出流例8.3使用setfill控制填充字符#include<iostream>#include<iomanip>usingnamespacestd;voidmain(){ doublevalues[]={1.23,15.16,653.7,4358.24}; cout<<setfill(‘*’); for(inti=0;i<4;i++) cout<<setw(10)<<values[i]<<endl;}

程序運(yùn)行結(jié)果為:1234.56.7第8章輸入/輸出流此語(yǔ)句也可以改為:

cout.fill(‘*’);fill()成員函數(shù)將返回設(shè)置前的填充字符8.3格式化輸入輸出8.3.3輸出精度控制:setprecision和precision

使用流操縱元setprecision以及成員函數(shù)precision可以控制浮點(diǎn)數(shù)輸出的精度。

注意:精度一旦設(shè)置,就可以用于以后所有輸出的數(shù)據(jù),直到下次精度發(fā)生改變。使用成員函數(shù)precision可以返回設(shè)置前的精度。第8章輸入/輸出流例8.4控制浮點(diǎn)數(shù)精度#include<iostream>#include<iomanip>usingnamespacestd;voidmain(){ doublevalue=31.4142743; intPreprecision=cout.precision(4); cout<<value<<endl; cout<<setprecision(Preprecision)<<value<<endl;}

程序運(yùn)行結(jié)果為:31.4131.4143第8章輸入/輸出流通過(guò)precision成員函數(shù)設(shè)置精度后,將以前精度值返回并保存在變量Preprecision中。注意:系統(tǒng)默認(rèn)精度為6,恢復(fù)原來(lái)的精度設(shè)置8.3格式化輸入輸出8.3.3輸出精度控制(續(xù))所設(shè)置的精度值,在程序沒(méi)有設(shè)置計(jì)數(shù)法情況下,表示浮點(diǎn)數(shù)的有效數(shù)字的個(gè)數(shù)。若程序設(shè)置了計(jì)數(shù)法(ios::fixed或ios::scientific),則表示小數(shù)點(diǎn)后數(shù)字的個(gè)數(shù)。

ios::fixed

表示以定點(diǎn)法輸出浮點(diǎn)數(shù)(不帶指數(shù))。

ios::scientific表示以科學(xué)計(jì)數(shù)法輸出浮點(diǎn)數(shù)。第8章輸入/輸出流例8.4(續(xù)一)#include<iostream>#include<iomanip>usingnamespacestd;voidmain(){ doublevalue=31.4142743;cout<<setiosflags(ios::fixed); intPreprecision=cout.precision(4); cout<<value<<endl; cout<<setprecision(Preprecision)<<value<<endl;}

程序運(yùn)行結(jié)果為:31.414331.414274第8章輸入/輸出流設(shè)置計(jì)數(shù)法:以定點(diǎn)法輸出浮點(diǎn)數(shù)例8.4(續(xù)二)#include<iostream>#include<iomanip>usingnamespacestd;voidmain(){ doublevalue=31.4142743;cout<<setiosflags(ios::scientific); intPreprecision=cout.precision(4); cout<<value<<endl; cout<<setprecision(Preprecision)<<value<<endl;}

程序運(yùn)行結(jié)果為:3.1414e+0013.141427e+001第8章輸入/輸出流設(shè)置計(jì)數(shù)法:以科學(xué)計(jì)數(shù)法輸出浮點(diǎn)數(shù)8.3格式化輸入輸出8.3.4其他格式狀態(tài)

上例中的setiosflags也是一個(gè)流操縱元,定義在頭文件<iomanip>中。通過(guò)將setiosflags的參數(shù)設(shè)置為各種不同流格式狀態(tài)標(biāo)志值,可以對(duì)相應(yīng)的輸入輸出格式進(jìn)行控制。若需要同時(shí)設(shè)置多個(gè)標(biāo)志位時(shí),可以使用按位或運(yùn)算符(|)將不同的標(biāo)志項(xiàng)結(jié)合。第8章輸入/輸出流第8章輸入/輸出流流格式狀態(tài)標(biāo)志說(shuō)

明ios::skipwsios::leftios::rightios::internalios::decios::octios::hexios::showbaseios::showpointios::uppercaseios::showposios::scientificios::fixed跳過(guò)輸入流的空白字符在輸出域中左對(duì)齊輸出,必要時(shí),在右邊填充字符在輸出域中右對(duì)齊輸出,必要時(shí),在左邊填充字符(默認(rèn))在輸出域中左對(duì)齊數(shù)值的符號(hào)及進(jìn)制符號(hào),右對(duì)齊數(shù)字值以十進(jìn)制形式格式化指定整數(shù)(默認(rèn))以八進(jìn)制形式格式化指定整數(shù)以十六進(jìn)制形式格式化指定整數(shù)在數(shù)值前輸出進(jìn)制(0表示八進(jìn)制,0x或0X表示十六進(jìn)制)輸出浮點(diǎn)數(shù)時(shí)顯示小數(shù)點(diǎn)和尾部的0輸出十六進(jìn)制數(shù)時(shí)顯示大寫(xiě)字母A~F,科學(xué)計(jì)數(shù)法顯示大寫(xiě)E輸出正數(shù)時(shí)前面加正號(hào)(+)以科學(xué)計(jì)數(shù)法顯示浮點(diǎn)數(shù)以定點(diǎn)表示法顯示浮點(diǎn)數(shù)I/O流格式狀態(tài)標(biāo)志例8.5使用setiosflags控制流格式#include<iostream>#include<iomanip>usingnamespacestd;voidmain(){ intx=200; cout<<setiosflags(ios::internal|ios::showpos); cout<<setw(10)<<x<<endl; cout<<setiosflags(ios::hex|ios::uppercase|ios::showbase);cout<<setw(10)<<x<<endl; cout<<oct<<setw(10)<<x<<endl;}

第8章輸入/輸出流將oct直接插入流中,也可使用:setiosflags(ios::oct)程序運(yùn)行結(jié)果為:+2000XC80310

8.3格式化輸入輸出8.3.4其他格式狀態(tài)(續(xù))使用流操縱元setiosflags設(shè)置相應(yīng)的標(biāo)志位后,對(duì)流對(duì)象產(chǎn)生的影響是持久的,若想恢復(fù)以前的默認(rèn)設(shè)置,可以通過(guò)resetiosflags流操縱元關(guān)閉相應(yīng)的標(biāo)志位。如:cout<<resetiosflags(ios::internal|ios::showbase);可以取消對(duì)域中對(duì)齊格式的設(shè)置,同時(shí)取消顯示數(shù)制標(biāo)志,恢復(fù)系統(tǒng)默認(rèn)格式。第8章輸入/輸出流

返回8.4文件的輸入輸出處理文件輸入輸出的流類(lèi)主要有ofstream、ifstream和fstream三個(gè)類(lèi)。均定義在fstream中。向文件輸出數(shù)據(jù)即將數(shù)據(jù)保存到文件中時(shí),要使用ofstream類(lèi);從文件中讀取數(shù)據(jù)即從文件中輸入數(shù)據(jù)時(shí),要使用ifstream類(lèi)。而使用fstream類(lèi)可以同時(shí)進(jìn)行輸入及輸出操作。

文件輸入輸出的一般步驟為:

創(chuàng)建流對(duì)象并打開(kāi)文件→讀寫(xiě)文件→關(guān)閉文件第8章輸入/輸出流8.4文件的輸入輸出8.4.1打開(kāi)文件1.

使用默認(rèn)構(gòu)造函數(shù),然后調(diào)用open函數(shù)用法如下:文件I/O流類(lèi)名流對(duì)象名;//聲明一個(gè)流對(duì)象流對(duì)象名.open(文件名,打開(kāi)方式);//調(diào)用open函數(shù)打開(kāi)文件如:ofstreammy_file; my_file.open(“boot.ini”,ios::out);參數(shù)“文件名”:用于指定要打開(kāi)文件的文件名

若為不帶路徑的文件名表示與當(dāng)前應(yīng)用程序在同一文件夾若帶路徑的文件名,注意‘\’應(yīng)用‘\\’表示第8章輸入/輸出流8.4文件的輸入輸出8.4.1打開(kāi)文件(續(xù)一)參數(shù)“打開(kāi)方式”:用于指定文件的打開(kāi)方式第8章輸入/輸出流打開(kāi)方式說(shuō)

明ios::inios::outios::appios::ateios::nocreateios::noreplaceios::truncios::binary打開(kāi)一個(gè)輸入文件,是ifstream對(duì)象的默認(rèn)方式打開(kāi)一個(gè)輸出文件,是ofstream對(duì)象的默認(rèn)方式。若打開(kāi)一個(gè)已有文件,則刪除原有內(nèi)容,若打開(kāi)的文件不存在,則將創(chuàng)建該文件。打開(kāi)一個(gè)輸出文件,用于在文件末尾添加數(shù)據(jù),不刪除文件原有內(nèi)容打開(kāi)一個(gè)現(xiàn)有文件(用于輸入或輸出),并定位到文件結(jié)尾僅打開(kāi)一個(gè)存在的文件(不存在則失?。﹥H打開(kāi)一個(gè)不存在的文件(存在則失?。┐蜷_(kāi)一個(gè)輸出文件,如果它存在則刪除文件原有內(nèi)容以二進(jìn)制模式打開(kāi)一個(gè)文件(默認(rèn)是文本模式)8.4文件的輸入輸出8.4.1打開(kāi)文件(續(xù)二)2.

在構(gòu)造函數(shù)中直接指定文件名及打開(kāi)方式用法如下:文件I/O流類(lèi)名流對(duì)象名(文件名,打開(kāi)方式);如:ifstreaminfile(“D:\\hello.dat”,ios::binary

);第8章輸入/輸出流如果使用以上兩種方法打開(kāi)文件不成功(如文件路徑不正確),文件流對(duì)象將為0,因此習(xí)慣上可用如下方式判斷打開(kāi)操作是否失敗:if(!my_file){……}//如果打開(kāi)文件的操作不成功8.4文件的輸入輸出8.4.2寫(xiě)入文件如果寫(xiě)入的是標(biāo)準(zhǔn)數(shù)據(jù)類(lèi)型的數(shù)據(jù)或字符串,可以直接通過(guò)插入運(yùn)算符(<<),將數(shù)據(jù)插入到輸出文件流對(duì)象中。如:ofstream

my_file(“D:\\data.txt”,ios::out);

my_file

<<“Hello!”<<‘’<<234<<endl;

使用插入運(yùn)算符在寫(xiě)入數(shù)據(jù)時(shí)僅局限于標(biāo)準(zhǔn)數(shù)據(jù)類(lèi)型及字符串,對(duì)于自定義類(lèi)型的數(shù)據(jù)并不能直接插入。第8章輸入/輸出流空格,是為了在文件中將數(shù)據(jù)分隔開(kāi),以便在讀出時(shí)能正確區(qū)分?jǐn)?shù)據(jù)。8.4文件的輸入輸出8.4.2寫(xiě)入文件(續(xù)一)1.

put函數(shù):使用put函數(shù)可以將一個(gè)單個(gè)字符寫(xiě)入流對(duì)象,進(jìn)而寫(xiě)入流對(duì)象所關(guān)聯(lián)的文件中。put函數(shù)每次只能寫(xiě)一個(gè)字符。用法如下:

my_file.put(‘A’);

char

ch=‘A’;my_file.put(ch);

注意:使用put函數(shù)輸出數(shù)據(jù)不受格式影響,即設(shè)置的域?qū)捄吞畛渥址麑?duì)于put函數(shù)不起作用。第8章輸入/輸出流8.4文件的輸入輸出8.4.2寫(xiě)入文件(續(xù)二)2.

write函數(shù):把內(nèi)存中的一塊內(nèi)容寫(xiě)入輸出流對(duì)象中。主要用于輸出數(shù)組及自定義類(lèi)型變量等具有連續(xù)內(nèi)存的數(shù)據(jù)。

write函數(shù)的第一個(gè)形參:

用于指定輸出數(shù)據(jù)的內(nèi)存起始地址,該地址為字符型(char*),因此傳遞的實(shí)參應(yīng)為字符型的指針。

write函數(shù)的第二個(gè)形參:

用于指定所寫(xiě)入的字節(jié)數(shù),即從該起始地址開(kāi)始寫(xiě)入多少字節(jié)的數(shù)據(jù),第二個(gè)形參類(lèi)型為整型。第8章輸入/輸出流例8.6使用write函數(shù)輸出CRect類(lèi)的對(duì)象#include<fstream>usingnamespacestd;voidmain(){ CRectr; r.SetColor(“Red”); r.Move(10,20); r.SetSize(100,200); ofstreamoutfile(“D:\\a.txt”,ios::out); outfile.write((char*)&r,sizeof(r)); outfile.close();//調(diào)用close函數(shù)關(guān)閉文件}

第8章輸入/輸出流定義輸出文件流對(duì)象并打開(kāi)文件進(jìn)行輸出將r地址強(qiáng)制類(lèi)型轉(zhuǎn)換(char*)為字符型指針例8.7使用write函數(shù)輸出整型數(shù)組#include<fstream>usingnamespacestd;voidmain(){ intarray[]={35,42,57,88,69,75}; ofstreamoutfile2(“D:\\a.txt”,ios::app); outfile2.write((char*)array,sizeof(array)); outfile2.close();}

第8章輸入/輸出流在打開(kāi)的文件尾添加數(shù)據(jù)將數(shù)組首地址強(qiáng)制類(lèi)型轉(zhuǎn)換若將主函數(shù)的array數(shù)組改為:chararray[]=“helloworld!”;則write語(yǔ)句將變?yōu)椋簅utfile2.write(array,sizeof(array));無(wú)須強(qiáng)制類(lèi)型轉(zhuǎn)換8.4文件的輸入輸出8.4.3讀取文件如果讀取的是標(biāo)準(zhǔn)數(shù)據(jù)類(lèi)型的數(shù)據(jù)或字符串,可以直接通過(guò)提取運(yùn)算符(>>),將數(shù)據(jù)從輸入文件流對(duì)象讀取到程序的變量中。使用提取運(yùn)算符提取數(shù)據(jù)時(shí),將以空白字符(如空格、Tab、回車(chē))作為數(shù)據(jù)之間的分隔符,因此這些空白字符不能被作為數(shù)據(jù)提取出來(lái)。如:char

s[10];

int

i;ifstream

in_file(“D:\\data.txt”,ios::in);

in_file>>s>>i;第8章輸入/輸出流若文件中數(shù)據(jù)為:Hello!234則s和i的數(shù)據(jù)分別為:“Hello!”、2348.4文件的輸入輸出8.4.3讀取文件(續(xù)一)1.

get函數(shù):使用get函數(shù)可以從流對(duì)象中提取一個(gè)單個(gè)字符,get函數(shù)彌補(bǔ)了提取運(yùn)算符不能提取空白字符的缺點(diǎn),它能把任意字符包括空白符提取出來(lái)。get函數(shù)提取一個(gè)字符時(shí),有帶形參和不帶形參兩種形式:

如:char

ch;

ch=cin.get();

或:

cin.get(ch);

若以上語(yǔ)句中調(diào)用get函數(shù)的是一個(gè)輸入文件流對(duì)象,則將從該流對(duì)象所關(guān)聯(lián)的文件中提取出單個(gè)字符。第8章輸入/輸出流8.4文件的輸入輸出8.4.3讀取文件(續(xù)二)2.

getline函數(shù):用于從流對(duì)象中提取多個(gè)字符,通常用于提取一行字符。get函數(shù)有三個(gè)形參。

get函數(shù)的第一個(gè)形參:

為字符型指針(char*),用于存放讀出的多個(gè)字符,通常傳遞的實(shí)參為字符數(shù)組。

get函數(shù)的第二個(gè)形參:

為整型,用于指定本次讀取的最大字符個(gè)數(shù)。

get函數(shù)的第三個(gè)形參:

為字符型,默認(rèn)值為回車(chē)符(‘\n’),用于指定分隔字符,作為一次讀取結(jié)束的標(biāo)志。第8章輸入/輸出流例8.8讀取文件E:\boot.txt中的內(nèi)容,并輸出到屏幕上#include<fstream>#include<iostream>usingnamespacestd;voidmain(){ chararray[100]; ifstreamifs(“E:\\boot.txt”,ios::nocreate); if(!ifs) return;//如果文件不存在,打開(kāi)不成功,則結(jié)束程序 while(!ifs.eof())//eof函數(shù)用于判斷是否到文件尾,到文件尾返回True { ifs.getline(array,100);//100表示每次讀取字符的個(gè)數(shù)最多為99個(gè) cout<<array<<endl; } ifs.close();}第8章輸入/輸出流使用getline函數(shù)按行讀取文件中的數(shù)據(jù),每次讀取一行時(shí),遇回車(chē)符或達(dá)到最大字符個(gè)數(shù),則結(jié)束,并將讀出數(shù)據(jù)保存于數(shù)組array中。

8.4文件的輸入輸出8.4.3讀取文件(續(xù)三)3.

read函數(shù):從流對(duì)象中提取整塊數(shù)據(jù)到變量中,主要用于提取數(shù)據(jù)到數(shù)組及自定義類(lèi)型變量中。

read函數(shù)的第一個(gè)形參:

用于保存讀出的數(shù)據(jù),類(lèi)型為字符型指針(char*),與write函數(shù)中用法一致。

read函數(shù)的第二個(gè)形參:

用于指定讀出多少個(gè)字節(jié),類(lèi)型為整型。與write函數(shù)中用法一致。第8章輸入/輸出流例8.9讀取例10.6中輸出到文件“D:\a.txt”中的內(nèi)容,并將矩形參數(shù)顯示到屏幕上#include<fstream>#include<iostream>usingnamespacestd;voidmain(){ CRectr2; ifstreamifile(“D:\\a.txt”); ifile.read((char*)&r2,sizeof(r2));//將讀出的數(shù)據(jù)保存到矩形對(duì)象r2中 ifile.close(); r2.Draw();}第8章輸入/輸出流程序運(yùn)行結(jié)果為:矩形左上角坐標(biāo)為(20,10)矩形長(zhǎng)和寬分別為100,200矩形的顏色是red8.4文件的輸入輸出8.4.4文件讀寫(xiě)位置指針

位置指針:用于保存在文件中進(jìn)行讀或?qū)懙奈恢?。通過(guò)對(duì)位置指針的操作,適當(dāng)?shù)卣{(diào)整讀或?qū)懙奈恢?,可以?shí)現(xiàn)對(duì)磁盤(pán)文件的隨機(jī)訪問(wèn)。與ofstream對(duì)應(yīng)的是寫(xiě)位置指針,指定下一次寫(xiě)數(shù)據(jù)的位置。相關(guān)的操作函數(shù)為:

seekp函數(shù):用于移動(dòng)指針到指定位置。

tellp函數(shù):用于返回指針當(dāng)前的位置。

與ifstream對(duì)應(yīng)的是讀位置指針,指定下一次讀數(shù)據(jù)的位置。相關(guān)的操作函數(shù)為:

seekg函數(shù):用于移動(dòng)指針到指定位置。

tellg函數(shù):用于返回指針當(dāng)前的位置。第8章輸入/輸出流8.4文件的輸入輸出8.4.4文件讀寫(xiě)位置指針(續(xù))

seekg函數(shù)的使用形式(seekp類(lèi)似):

seekg(n):用于移動(dòng)指針到文件第n個(gè)字節(jié)后。

seekg(n,ios::beg):從文件起始位置向后移動(dòng)n個(gè)字節(jié)。seekg(n,ios::end):從文件結(jié)尾位置向前移動(dòng)n個(gè)字節(jié)。

seekg(n,ios::cur):從當(dāng)前位置向前或向后移動(dòng)n個(gè)字節(jié)。

其中:n=0,在指定位置;n>0,在指定位置向后移動(dòng);n<0,在指定位置向前移動(dòng)。

tellg函數(shù)的使用形式(tellp類(lèi)似):

streamposn=流對(duì)象.tellg()

streampos可看作整型數(shù)據(jù),返回值保存指針當(dāng)前的位置。第8章輸入/輸出流例8.10

已知文件data.txt中存有10個(gè)CRect對(duì)象的數(shù)據(jù),現(xiàn)要求讀取最后一個(gè)對(duì)象,把它的左上角坐標(biāo)修改為(100,100),其他不變,修改后寫(xiě)回到文件中去。#include<fstream>

usingnamespacestd; voidmain() { CRectrt; ifstreamifs(“data.txt”); ifs.seekg(0,ios::end);//將指針移動(dòng)到文件尾

streamposlof=ifs.tellg();//求得文件長(zhǎng)度lof ifs.seekg(-lof/10,ios::end);//將指針移動(dòng)到最后一條記錄起始位置

ifs.read((char*)&rt,sizeof(CRect)); ifs.close(); rt.Move(100,100); ofstreamofs(“data.txt”,ios::ate);//以ios::ate方式打開(kāi)文件防止刪除原來(lái)內(nèi)容

ofs.seekp(-lof/10,ios::end);//將指針移動(dòng)到最后一條記錄起始位置

ofs.write((char*)&rt,sizeof(CRect)); ofs.close(); }

第8章輸入/輸出流8.4文件的輸入輸出8.4.5錯(cuò)誤處理函數(shù)

eof()——如果輸入流結(jié)束,到文件尾,則返回True;

bad()——如果出現(xiàn)一個(gè)嚴(yán)重的、不可恢復(fù)的錯(cuò)誤,如由于非法操作導(dǎo)致數(shù)據(jù)丟失、對(duì)象狀態(tài)不可用等,則返回True,通常這種錯(cuò)誤不可修復(fù),此時(shí)不要對(duì)流再進(jìn)行I/O操作;

fail()——如果某種操作失敗,如打開(kāi)操作不成功,或不能讀出數(shù)據(jù),或讀出數(shù)據(jù)的類(lèi)型不符等等,則返回True;

good()——如果以上三種錯(cuò)誤均未發(fā)生,表示流對(duì)象狀態(tài)正常,則返回True。以上函數(shù)可由流對(duì)象直接調(diào)用,如:if(!inf.eof())//如果沒(méi)有到文件末尾,if條件滿足第8章輸入/輸出流8.4文件的輸入輸出8.4.6關(guān)閉文件文件使用完畢后必須將其關(guān)閉才能斷開(kāi)流和對(duì)象之間的聯(lián)系。文件關(guān)閉后,還可以再次與流對(duì)象關(guān)聯(lián),打開(kāi)文件進(jìn)行輸入或輸出操作。使用流對(duì)象的close函數(shù)可以完成關(guān)閉文件的操作,close函數(shù)無(wú)形參,

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論