C++中輸入輸出流及文件流操作總結(jié)
本文實(shí)例為大家分享了C++中輸入輸出流及文件流操作筆記,供大家參考,具體內(nèi)容如下
1、流的控制
iomanip 在使用格式化I/O時(shí)應(yīng)包含此頭文件。
stdiostream 用于混合使用C和C + +的I/O機(jī)制時(shí),例如想將C程序轉(zhuǎn)變?yōu)镃++程序
2、類(lèi)繼承關(guān)系
ios是抽象基類(lèi),由它派生出istream類(lèi)和ostream類(lèi), iostream類(lèi)支持輸入輸出操作,iostream類(lèi)是從istream類(lèi)和ostream類(lèi)通過(guò)多重繼承而派生的類(lèi)
類(lèi)ifstream繼承了類(lèi)istream,類(lèi)ofstream繼承了類(lèi)ostream,類(lèi)fstream繼承了 類(lèi)iostream
iostream頭文件中4種流對(duì)象
cout補(bǔ)充
1、用“cout<<”輸出基本類(lèi)型的數(shù)據(jù)時(shí),可以不必考慮數(shù)據(jù)是什么類(lèi)型,系統(tǒng)會(huì)判斷數(shù)據(jù)的類(lèi)型
并根據(jù)其類(lèi)型選擇調(diào)用與之匹配的運(yùn)算符重載函數(shù)。這個(gè)過(guò)程都是自動(dòng)的,用戶不必干預(yù)。
如果在C語(yǔ)言中用prinf函數(shù)輸出不同類(lèi)型的數(shù)據(jù),必須分別指定相應(yīng)的輸出格式符,十分麻煩,而且容易出錯(cuò)
2、cout流在內(nèi)存中對(duì)應(yīng)開(kāi)辟了一個(gè)緩沖區(qū),用來(lái)存放流中的數(shù)據(jù),當(dāng)向cout流插 人一個(gè)endl時(shí),
不論緩沖區(qū)是否已滿,都立即輸出流中所有數(shù)據(jù),然后插入一個(gè)換行符, 并刷新流(清空緩沖區(qū))。
注意如果插人一個(gè)換行符”\n“(如cout<<a<<"\n"),則只輸出和換行,而不刷新cout 流(但并不是所有編譯系統(tǒng)都體現(xiàn)出這一區(qū)別)。
3、在iostream中只對(duì)"<<"和">>"運(yùn)算符用于標(biāo)準(zhǔn)類(lèi)型數(shù)據(jù)的輸入輸出進(jìn)行了重載,但未對(duì)用戶聲明的類(lèi)型數(shù)據(jù)的輸入輸出 進(jìn)行重載。
如果用戶聲明了新的類(lèi)型,并希望用"<<"和">>"運(yùn)算符對(duì)其進(jìn)行輸入輸出,按照重運(yùn)算符重載來(lái)做。
cout 流通常是傳送到顯示器輸出,但也可以被重定向 輸出到磁盤(pán)文件,而cerr流中的信息只能在顯示器輸出
cerr是不經(jīng)過(guò)緩沖區(qū),直接向顯示器上輸出有關(guān)信息,而clog中的信息存放在緩沖區(qū)中,緩沖區(qū)滿后或遇endl時(shí)向顯示器輸出
3、標(biāo)準(zhǔn)輸入流 cin
重點(diǎn)掌握的函數(shù)
cin.get() //讀入一個(gè)字符并返回它的值
cin.get(一個(gè)參數(shù)) //讀入一個(gè)字符并把它存儲(chǔ)在ch
cin.get(兩個(gè)參數(shù)) //可以讀取字符串
cin.get(三個(gè)參數(shù)) //可以讀字符串
cin.getline()
cin.ignore() //讀取字符并忽略指定字符
cin.peek() //檢查下一個(gè)輸入的字符,不會(huì)把字符從流中移除
cin.putback() //返回一個(gè)字符給一個(gè)流
重要
1、使用cin,從流中讀出的字符,流中就沒(méi)有這字符了,再次讀取時(shí)只能讀取剩下的
2、緩沖去只有在遇到EOF、手動(dòng)敲回車(chē)、流(緩存區(qū))滿時(shí),才將流中的字符全部讀出(即清空緩存區(qū))
練習(xí)
1、從流中取一個(gè)字符,然后在放進(jìn)去;
2、判斷流中的第一個(gè)字符是不是放進(jìn)去的那個(gè)字符;
3、從流中讀取10個(gè)字符;
4、從流中忽略5個(gè)字符,再讀取10個(gè)字符;
5、最后讀取剩下的字符,最后輸出讀到的所有字符
#include <iostream> using namespace std; int main() { char ch1; int look; char str1[11] = {0}; char str2[11] = {0}; char str3[100] = {0}; //從流中取一個(gè)字符,然后在放進(jìn)去 ch1 = cin.get(); cin.putback(ch1); //判斷流中的第一個(gè)字符是不是放進(jìn)去的那個(gè)字符 look = cin.peek(); if(look == (int)ch1) { cout<<"cin.peek()放進(jìn)去的字符在第一個(gè)位置"<<endl; } else { cout<<"cin.peek()放進(jìn)去的字符不是在第一個(gè)位置"<<endl; } //從流中讀取10個(gè)字符 cin.get(str1,11); //從流中忽略5個(gè)字符,再讀取10個(gè)字符 cin.ignore(5); cin.get(str2,11,EOF); //最后讀取剩下的字符,最后輸出讀到的所有字符 cin.getline(str3,100); //輸出讀到的數(shù)據(jù) cout<<"第一個(gè)字符"<<ch1<<endl; cout<<"第一組 字符串:"<<str1<<endl; cout<<"第二組 字符串:"<<str2<<endl; cout<<"剩下的字符串:"<<str3<<endl; system("pause"); return 0; }
輸出:
0123456789abcde9876543210zzzzzzzzzzxxxxxxxxxxxxxyyyyyyyyyyyy cin.peek()放進(jìn)去的字符在第一個(gè)位置 第一個(gè)字符0 第一組 字符串:0123456789 第二組 字符串:9876543210 剩下的字符串:zzzzzzzzzzxxxxxxxxxxxxxyyyyyyyyyyyy
4、標(biāo)準(zhǔn)輸出流 cout
流成員函數(shù)
cout.flush() //清空緩沖區(qū)
cout.put() //把字符寫(xiě)入流中
cout.write() //將字符串寫(xiě)入當(dāng)前輸出流中
eg : cout.setf( ios::dec );
cout.setf(ios::hex,ios::basefield);【建議使用這種】
需注意:
1、fmtflags setf( fmtflags flags ); 使用這種,一定要先取消當(dāng)前基【cout.unself()】,之后才可以設(shè)置新的基
2、fmtflags setf( fmtflags flags, fmtflags needed ); 使用這種,第二個(gè)參數(shù)設(shè)為當(dāng)前的基,或者當(dāng)不知道當(dāng)前基時(shí),設(shè)為ios_base::basefield清除當(dāng)前的所有可能的基
控制符,頭文件<iomanip>
eg: cout<<setw(5);
5、文件I/O
由于文件設(shè)備并不像顯示器屏幕與鍵盤(pán)那樣是標(biāo)準(zhǔn)默認(rèn)設(shè)備,不能像cout那樣預(yù)先定義的全局對(duì)象,所以我們必須自己定義一個(gè)該類(lèi)的對(duì)象。
ifstream類(lèi),它是從istream類(lèi)派生的,用來(lái)支持從磁盤(pán)文件的輸入。
ofstream類(lèi),它是從ostream類(lèi)派生的,用來(lái)支持向磁盤(pán)文件的輸出。
fstream類(lèi),它是從iostream類(lèi)派生的,用來(lái)支持對(duì)磁盤(pán)文件的輸入輸出。
文件原理
文件打開(kāi)都有一個(gè)文件指針,該指針的初始位置由I/O方式指定,每次讀寫(xiě)都從文件指針的當(dāng)前位置開(kāi)始。每讀入一個(gè)字節(jié),指針就后移一個(gè)字節(jié)。當(dāng)文件指針移到最后,就會(huì)遇到文件結(jié)束EOF(文件結(jié)束符也占一個(gè)字節(jié),其值為-1),此時(shí)流對(duì)象的成員函數(shù)eof的值為非0值(一般設(shè)為1),表示文件結(jié)束 了。
文件關(guān)閉,實(shí)際上是解除該磁盤(pán)文件與文件流的關(guān)聯(lián),原來(lái)設(shè)置的工作方式也失效,這樣,就不能再通過(guò)文件流對(duì)該文件進(jìn)行輸入或輸出
文件類(lèi)型:1、ASCII文件:文件的每一個(gè)字節(jié)中均以ASCII代碼形式存放數(shù)據(jù),即一個(gè)字節(jié)存放一個(gè)字符,這個(gè)文件就是ASCII文件(或稱字符文件)。
2、二進(jìn)制文件:文件中的信息不是字符數(shù)據(jù),而是字節(jié)中的二進(jìn)制形式的信息,因此它又稱為字節(jié)文件
常用函數(shù)
打開(kāi)文件:
方式1:對(duì)文件輸出流、文件流對(duì)象,通過(guò)ofstream類(lèi)的構(gòu)造函數(shù)打開(kāi)文件
格式: ofstream (磁盤(pán)文件名, 輸入輸出方式);
如果ofstream 為0(假),表示打開(kāi)操作失敗
如: ofstream fout1(fname,ios::out);
輸入輸出方式可以使用能夠進(jìn)行組合使用的,以“或”運(yùn)算(“|”)的方式,如:fstream fout(fname,ios::out|ios::in)
方式2:對(duì)文件的輸出和輸入流對(duì)象、文件流對(duì)象,都可通過(guò)open函數(shù)打開(kāi)文件
格式: 文件流對(duì)象.open(磁盤(pán)文件名, 輸入輸出方式);
返回值:為0(假),打開(kāi)操作失敗
如: fout.open(fname,ios::out)
關(guān)閉文件:
在對(duì)已打開(kāi)的磁盤(pán)文件的讀寫(xiě)操作完成后,必須要關(guān)閉該文件 如: outfile.close( );
文件操作
1、可以用流插入運(yùn)算符“<<”和流提取運(yùn)算符“>>”輸入輸出標(biāo)準(zhǔn)類(lèi)型的數(shù)據(jù)(>> 讀出時(shí)在遇空格、換行都結(jié)束)。
2、也可以用文件流的put、get、geiline等成員函數(shù)進(jìn)行字符的輸入輸出。
#include <iostream> using namespace std; #include "fstream" int main() { char fname[] = "d:/file1.txt"; char buff[1024]= {0}; /*********** 寫(xiě)文件 *************/ //方式1 輸出流ofstream對(duì)象調(diào)用fopen函數(shù) ofstream fout; fout.open(fname,ios::out); if(!fout) { cout<<"打開(kāi)文件失敗"<<fname<<endl; } fout<< "hello world !"; //通過(guò)左移運(yùn)算符寫(xiě)入字符串 fout.flush(); fout.close(); //方式2 調(diào)用輸出流ofstream對(duì)象的構(gòu)造函數(shù) ofstream fout1(fname,ios::out); if(!fout1) { cout<<"打開(kāi)文件失敗"<<fname<<endl; } fout1.put('h'); //通過(guò)put函數(shù)寫(xiě)入字符 fout1.put('e'); fout1.put('l'); fout1.put('l'); fout1.put('o'); fout1.put('\n'); fout1.flush(); fout1.close(); //文件流對(duì)象寫(xiě)文件 fstream file2(fname,ios::in|ios::out); file2<<"abdfd\n"; file2<<"11111\n"; file2.flush(); file2.close(); /*********** 讀文件 *************/ //輸入流ifstream對(duì)象讀取文件內(nèi)容 ifstream fin; fin.open(fname,ios::in); fin.getline(buff,1024); //通過(guò)getline函數(shù)讀取字符串 cout<<buff<<endl; fin.close(); //文件流對(duì)象讀文件內(nèi)容 fstream file1(fname,ios::in|ios::out); file1>>buff; //通過(guò)右移運(yùn)算符讀出字符串 file1.close(); cout<<buff<<endl; system("pause"); return 0; }
二進(jìn)制文件操作
對(duì)二進(jìn)制文件的讀寫(xiě)主要用istream類(lèi)的成員函數(shù)read和write來(lái)實(shí)現(xiàn)。這兩個(gè)成員函數(shù)的原型為
istream& read(char *buffer,int len);
ostream& write(const char * buffer,int len);
#include <iostream> using namespace std; #include <fstream> class Teacher { public: Teacher() { } Teacher(int age,char name[20]) { this->age = age; strcpy(this->name,name); } void prinfInfo() { cout<<"Teacher name:"<<this->name<<" age:"<<this->age<<endl; } private: int age; char name[20]; }; int main() { Teacher t1(31,"xiaoming"); Teacher t2(32,"xiaohong"); Teacher t3(33,"xiaohua"); Teacher t4(34,"xiaoxin"); char fname[] = "d:/file2"; fstream fs(fname,ios::binary|ios::out); if(!fs) { cout<<"文件打開(kāi)失敗"<<endl; } fs.write((char *)&t1,sizeof(Teacher)); fs.write((char *)&t2,sizeof(Teacher)); fs.write((char *)&t3,sizeof(Teacher)); fs.write((char *)&t4,sizeof(Teacher)); fs.flush(); fs.close(); fstream fs2(fname,ios::binary|ios::in); if(!fs) { cout<<"文件打開(kāi)失敗"<<endl; } Teacher tt; fs2.read((char *)&tt,sizeof(Teacher)); tt.prinfInfo(); fs2.read((char *)&tt,sizeof(Teacher)); tt.prinfInfo(); fs2.read((char *)&tt,sizeof(Teacher)); tt.prinfInfo(); fs2.read((char *)&tt,sizeof(Teacher)); tt.prinfInfo(); fs2.close(); system("pause"); return 0; }
輸出:
Teacher name:xiaoming age:31 Teacher name:xiaohong age:32 Teacher name:xiaohua age:33 Teacher name:xiaoxin age:34
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++函數(shù)模板與類(lèi)模板實(shí)例解析
這篇文章主要介紹了C++函數(shù)模板與類(lèi)模板,需要的朋友可以參考下2014-08-08OpenCV圖像旋轉(zhuǎn)Rotate的詳細(xì)介紹
這篇文章主要介紹了OpenCV圖像旋轉(zhuǎn)Rotate,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05詳解在C++中顯式默認(rèn)設(shè)置的函數(shù)和已刪除的函數(shù)的方法
這篇文章主要介紹了在C++中顯式默認(rèn)設(shè)置的函數(shù)和已刪除的函數(shù)的方法,文中講到了C++11標(biāo)準(zhǔn)中的新特性,需要的朋友可以參考下2016-01-01C++封裝靜態(tài)鏈接庫(kù)和使用的詳細(xì)步驟
這篇文章主要介紹了C++封裝靜態(tài)鏈接庫(kù)和使用,本文描述了怎么去把一個(gè)C++程序封裝成一個(gè)靜態(tài)庫(kù)并且如何去使用這些靜態(tài)庫(kù),需要的朋友可以參考下2022-08-08