亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

詳解C++編程中的文件流與字符串流

2020-05-23 14:13:55
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了C++編程中的文件流與字符串流,是C++入門學習中的基礎知識,需要的朋友可以參考下

C++文件流類與文件流對象

文件流是以外存文件為輸入輸出對象的數據流。輸出文件流是從內存流向外存文件的數據,輸入文件流是從外存文件流向內存的數據。每一個文件流都有一個內存緩沖區與之對應。

請區分文件流與文件的概念,不用誤以為文件流是由若干個文件組成的流。文件流本身不是文件,而只是以文件為輸入輸出對象的流。若要對磁盤文件輸入輸出,就必須通過文件流來實現。

在C++的I/O類庫中定義了幾種文件類,專門用于對磁盤文件的輸入輸出操作。

除了標準輸入輸出流類istream、ostream和iostream類外,還有3個用于文件操作的文件類:

ifstream類,它是從istream類派生的,用來支持從磁盤文件的輸入。

ofstream類,它是從ostream類派生的,用來支持向磁盤文件的輸出。

fstream類,它是從iostream類派生的,用來支持對磁盤文件的輸入輸出。

要以磁盤文件為對象進行輸入輸出,必須定義一個文件流類的對象,通過文件流對象將數據從內存輸出到磁盤文件,或者通過文件流對象從磁盤文件將數據輸入到內存。

其實在用標準設備為對象的輸入輸出中,也是要定義流對象的,如cin、cout就是流對象,C++是通過流對象進行輸入輸出的。由于cin、cout已在iostream.h中事先定義,所以用戶不需自己定義。在用磁盤文件時,由于情況各異,無法事先統一定義,必須由用戶自己定義。此外,對磁盤文件的操作是通過文件流對象(而不是cin和cout)實現的。文件流對象是用文件流類定義的,而不是用istream和ostream類來定義的??梢杂孟旅娴姆椒ń⒁粋€輸出文件流對象:

 

 
  1. ofstream outfile; 

如同在頭文件iostream中定義了流對象cout —樣,現在在程序中定義了outfile為 ofstream類(輸出文件流類)的對象。但是有一個問埋還未解決:在定義 cout 時已將它和標準輸出設備(顯示器)建立關聯,而現在雖然建立了一個輸出文件流對象,但是還未指定它向哪一個磁盤文件輸出,需要在使用時加以指定。

C++對字符串流的讀寫

文件流是以外存文件為輸入輸出對象的數據流,字符串流不是以外存文件為輸入輸出的對象,而以內存中用戶定義的字符數組(字符串)為輸入輸出的對象,即將數據輸出到內存中的字符數組,或者從字符數組(字符串)將數據讀入。字符串流也稱為內存流。

字符串流也有相應的緩沖區,開始時流緩沖區是空的。如果向字符數組存入數據,隨著向流插入數據,流緩沖區中的數據不斷增加,待緩沖區滿了(或遇換行符),一起存入字符數組。如果是從字符數組讀數據,先將字符數組中的數據送到流緩沖區,然后從緩沖區中提取數據賦給有關變量。

在字符數組中可以存放字符,也可以存放整數、浮點數以及其他類型的數據。在向字符數組存入數據之前,要先將數據從二進制形式轉換為ASCII代碼,然后存放在緩沖區, 再從緩沖區送到字符數組。從字符數組讀數據時,先將字符數組中的數據送到緩沖區,在賦給變量前要先將ASCII代碼轉換為二進制形式。總之,流緩沖區中的數據格式與字符數組相同。這種情況與以標準設備(鍵盤和顯示器)為對象的輸入輸出是類似的,鍵盤和顯示器都是按字符形式輸入輸出的設備,內存中的數據在輸出到顯示器之前,先要轉換為 ASCII碼形式,并送到輸出緩沖區中。從鍵盤輸入的數據以ASCII碼形式輸入到輸入緩沖區,在賦給變量前轉換為相應變量類型的二進制形式,然后賦給變量。對于字符串流的輸入輸出的情況,如不清楚,可以從對標準設備的輸入輸出中得到啟發。

文件流類有ifstream,ofstream和fstream,而字符串流類有istrstream,ostrstream和strstream。文件流類和字符串流類都是ostream,istream和iostream類的派生類,因此對它們的操作方法是基本相同的。向內存中的一個字符數組寫數據就如同向文件寫數據一樣,但有3點不同:

輸出時數據不是流向外存文件,而是流向內存中的一個存儲空間。輸入時從內存中的存儲空間讀取數據。在嚴格的意義上說,這不屬于輸入輸出,稱為讀寫比較合適。 因為輸入輸出一般指的是在計算機內存與計算機外的文件(外部設備也視為文件)之間 的數據傳送。但由于C++的字符串流采用了 C++的流輸入輸出機制,因此往往也用輸入和輸出來表述讀寫操作。

字符串流對象關聯的不是文件,而是內存中的一個字符數組,因此不需要打開和關閉文件。

每個文件的最后都有一個文件結束符,表示文件的結束。而字符串流所關聯的字符數組中沒有相應的結束標志,用戶要指定一個特殊字符作為結束符,在向字符數組寫入全部數據后要寫入此字符。

字符串流類沒有open成員函數,因此要在建立字符串流對象時通過給定參數來確立字符串流與字符數組的關聯。即通過調用構造函數來解決此問題。建立字符串流對象的方法與含義如下。

建立輸出字符串流對象

ostrstream類提供的構造函數的原型為:

 

 
  1. ostrstream::ostrstream(char *buffer,int n,int mode=ios::out); 

buffer是指向字符數組首元素的指針,n為指定的流緩沖區的大小(一般選與字符數組的大小相同,也可以不同),第3個參數是可選的,默認為ios::out方式。可以用以下語句建立輸出字符串流對象并與字符數組建立關聯:

 

 
  1. ostrstream strout(ch1,20); 

作用是建立輸出字符串流對象strout,并使strout與字符數組ch1關聯(通過字符串流將數據輸出到字符數組ch1),流緩沖區大小為20。

建立輸入字符串流對象

istrstream類提供了兩個帶參的構造函數,原型為:

 

 
  1. istrstream::istrstream(char *buffer); 
  2. istrstream::istrstream(char *buffer,int n); 

buffer是指向字符數組首元素的指針,用它來初始化流對象(使流對象與字符數組建立關聯)??梢杂靡韵抡Z句建立輸入字符串流對象:

 

 
  1. istrstream strin(ch2); 

作用是建立輸入字符串流對象strin,將字符數組ch2中的全部數據作為輸入字符串流的內容。

 

 
  1. istrstream strin(ch2,20); 

流緩沖區大小為20,因此只將字符數組ch2中的,20個字符作為輸入字符串流的內容。

建立輸入輸出字符串流對象

strstream類提供的構造函數的原型為:

 

 
  1. strstream::strstream(char *buffer,int n,int mode); 

可以用以下語句建立輸入輸出字符串流對象:

 

 
  1. strstream strio(ch3,sizeof(ch3),ios::in|ios::out); 

作用是建立輸入輸出字符串流對象,以字符數組ch3為輸入輸出對象,流緩沖區大小與數組ch3相同。

以上個字符串流類是在頭文件strstream中定義的,因此程序中在用到istrstream、ostrstream和strstream類時應包含頭文件strstream(在GCC中,用頭文件strstream)。

[例] 將一組數據保存在字符數組中。

 

 
  1. #include <strstream> 
  2. using namespace std; 
  3. struct student 
  4. int num; 
  5. char name[20]; 
  6. float score; 
  7. }; 
  8. int main( ) 
  9. student stud[3]={1001,"Li",78,1002,"Wang",89.5,1004,"Fun",90}; 
  10. char c[50]; //用戶定義的字符數組 
  11. ostrstream strout(c,30); //建立輸出字符串流,與數組c建立關聯,緩沖區長 
  12. for(int i=0;i<3;i++) //向字符數組c寫個學生的數據 
  13. strout<<stud[i].num<<stud[i].name<<stud[i].score; 
  14. strout<<ends; //ends是C++的I/O操作符,插入一個'//0' 
  15. cout<<"array c:"<<c<<endl; //顯示字符數組c中的字符 

運行時在顯示器上的輸出如下:

 

 
  1. array c: 
  2. 1001Li781002Wang89.51004Fun90 

以上就是字符數組c中的字符??梢钥吹剑?/p>

1) 字符數組c中的數據全部是以ASCII代碼形式存放的字符,而不是以二進制形式表示的數據。

2) 在建立字符串流strout時指定流緩沖區大小為30字節,與字符數組c的大小不同,這是允許的,這時字符串流最多可以傳送30個字符給字符數組c。請思考:如果將流 緩沖區大小改為10字節,即:

 

 
  1. ostrstream.strout( c ,10); 

運行情況會怎樣?流緩沖區只能存放10個字符,將這10個字符寫到字符數組c中。運行時顯示的結果是:

 

 
  1. 1001Li7810 

字符數組c中只有10個有效字符。一般都把流緩沖區的大小指定與字符數組的大小 相同。

3) 字符數組c中的數據之間沒有空格,連成一片,這是由輸出的方式決定的。如果以后想將這些數據讀回賦給程序中相應的變量,就會出現問題,因為無法分隔兩個相鄰的數據。為解決此問題,可在輸出時人為地加入空格。如

 

 
  1. for(int i=0;i<3;i++) 
  2. strout<<" "<<stud[i].num<<" "<<stud[i].name<<" "<<stud[i].score; 

同時應修改流緩沖區的大小,以便能容納全部內容,今改為字節。這樣,運行時將輸出:

 

 
  1. 1001 Li 78 1002 Wang 89.5 1004 Fun 90 

再讀入時就能清楚地將數據分隔開。

[例] 在一個字符數組c中存放了個整數,以空格相間隔,要求將它們放到整型數組中,再按大小排序,然后再存放回字符數組c中。

 

 
  1. #include <strstream> 
  2. using namespace std; 
  3. int main( ) 
  4. char c[50]="12 34 65 -23 -32 33 61 99 321 32"
  5. int a[10],i,j,t; 
  6. cout<<"array c:"<<c<<endl; //顯示字符數組中的字符串 
  7. istrstream strin(c,sizeof(c)); //建立輸入串流對象strin并與字符數組c關聯 
  8. for(i=0;i<10;i++) 
  9. strin>>a[i]; //從字符數組c讀入個整數賦給整型數組a 
  10. cout<<"array a:"
  11. for(i=0;i<10;i++) 
  12. cout<<a[i]<<" "//顯示整型數組a各元素 
  13. cout<<endl; 
  14. for(i=0;i<9;i++) //用起泡法對數組a排序 
  15. for(j=0;j<9-i;j++) 
  16. if(a[j]>a[j+1]) 
  17. {t=a[j];a[j]=a[j+1];a[j+1]=t;} 
  18. ostrstream strout(c,sizeof(c)); //建立輸出串流對象strout并與字符數組c關聯 
  19. for(i=0;i<10;i++) 
  20. strout<<a[i]<<" "//將個整數存放在字符數組c 
  21. strout<<ends; //加入'//0' 
  22. cout<<"array c:"<<c<<endl; //顯示字符數組c 
  23. return 0; 

運行結果如下:

 

 
  1. array c: 12 34 65 -23 -32 33 61 99 321 32(字符數組c原來的內容) 
  2. array a: 12 34 65 -23 -32 33 61 99 321 32 (整型數組a的內容) 
  3. array c: -32 –12 32 33 34 61 65 99 321 (字符數組c最后的內容) 

對字符串流的幾點說明:

1) 用字符串流時不需要打開和關閉文件。

2) 通過字符串流從字符數組讀數據就如同從鍵盤讀數據一樣,可以從字符數組讀入字符數據,也可以讀入整數、浮點數或其他類型數據。如果不用字符串流,只能從字符數組逐個訪問字符,而不能按其他類型的數據形式讀取數據。這是用字符串流訪問字符數組的優點,使用方便靈活。

3) 程序中先后建立了兩個字符串流strin和strout,與字符數組c關聯。strin從字符數組c中獲取數據,strout將數據傳送給字符數組。分別對同一字符數組進行操作。甚至可以對字符數組交叉進行讀寫,輸入字符串流和輸出字符串流分別有流指針指示當前位 置,互不干擾。

4) 用輸出字符串流向字符數組c寫數據時,是從數組的首地址開始的,因此更新了 數組的內容。

5) 字符串流關聯的字符數組并不一定是專為字符串流而定義的數組,它與一般的字符數組無異,可以對該數組進行其他各種操作。

通過以上對字符串流的介紹,大家可以看到:與字符串流關聯的字符數組相當于內存中的臨時倉庫,可以用來存放各種類型的數據(以ASCII形式存放),在需要時再從中讀回來。它的用法相當于標準設備(顯示器與鍵盤),但標準設備不能保存數據,而字符數組中的內容可以隨時用ASCII字符輸出。它比外存文件使用方便,不必建立文件(不 需打開與關閉),存取速度快。但它的生命周期與其所在的模塊(如主函數)相同,該模塊的生命周期結束后,字符數組也不存在了。因此只能作為臨時的存儲空間。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产在线视频欧美| 午夜免费在线观看精品视频| 美女黄色丝袜一区| 亚洲精品日韩久久久| 日韩激情视频在线播放| 国产91精品久久久久| 欧美一级电影久久| 日韩欧美一区二区三区久久| 国产精品一区二区性色av| 亚洲天堂网站在线观看视频| 日韩一区二区欧美| 日韩精品中文字幕在线观看| 国语自产偷拍精品视频偷| 精品亚洲夜色av98在线观看| 亚洲福利在线播放| 91久久精品国产91久久性色| 一区二区三区无码高清视频| 亚洲成年网站在线观看| 国产91成人在在线播放| 欧美第一黄网免费网站| 亚洲欧美国产高清va在线播| 亚洲影视中文字幕| 国产日韩精品在线| 日韩精品免费看| 亚洲xxxx妇黄裸体| 国产精品美女主播在线观看纯欲| 成人有码在线播放| 国产精品男人的天堂| 亚洲精品视频播放| 中文字幕日韩电影| yellow中文字幕久久| 国产一区二区在线免费视频| 国产精品aaa| 91香蕉电影院| 亚洲区中文字幕| 国产精品91免费在线| 欧美精品免费在线观看| 亚洲精品98久久久久久中文字幕| 久久精品国产亚洲一区二区| 成人做爰www免费看视频网站| 欧美日韩中文字幕在线视频| 亚洲精品久久久久久下一站| 亚洲欧洲中文天堂| 国产精品旅馆在线| 久久久久久久一区二区| 中文字幕一区日韩电影| 最近2019中文字幕在线高清| 欧美高清在线观看| 蜜臀久久99精品久久久无需会员| 久久韩国免费视频| 91老司机精品视频| 97在线观看视频| 欧美一级大片视频| 另类图片亚洲另类| 欧美日韩国产一中文字不卡| 中文字幕欧美国内| 国产美女主播一区| 国产精品∨欧美精品v日韩精品| 亚洲一区二区三区在线视频| 亚洲白拍色综合图区| 色在人av网站天堂精品| 久久天堂av综合合色| 美女久久久久久久| 国产精品高清在线观看| 亚洲xxxxx性| 丁香五六月婷婷久久激情| 亚洲人成电影在线播放| 亚洲欧美日韩中文在线| 91国产视频在线播放| 欧美在线影院在线视频| 国产精品99久久久久久久久久久久| 欧美中文字幕在线观看| 成人久久久久久| 亚洲精品视频二区| 国产午夜精品美女视频明星a级| 精品久久久久久中文字幕一区奶水| 亚洲国产精品久久久久久| 98精品国产高清在线xxxx天堂| 国内精品久久影院| 国产成人综合亚洲| 97视频在线观看成人| 国产精品视频免费在线观看| 5566日本婷婷色中文字幕97| 日韩亚洲欧美中文高清在线| 亚洲xxx视频| 亚洲欧洲日韩国产| 日韩精品999| 亚洲精品少妇网址| 成人精品视频99在线观看免费| 久久久精品视频在线观看| 97精品国产97久久久久久| 久久在线免费观看视频| 欧美激情免费视频| 最近2019中文字幕第三页视频| 久久精品久久久久久| 亚洲国产精久久久久久久| 91精品国产91久久久久福利| 国产在线观看精品| 国产精品高清在线观看| 午夜精品久久久久久久久久久久久| 久久人人爽人人爽人人片亚洲| 国产丝袜一区二区三区| 中文字幕精品www乱入免费视频| 久久99久久亚洲国产| 亚洲欧美中文日韩在线| 精品国产一区久久久| 国产有码在线一区二区视频| 亚洲人成网站999久久久综合| 久久久久久久久久久久av| 亚洲国产成人精品久久| 国产精品欧美日韩| 国产亚洲精品91在线| 国产精品普通话| 这里只有精品视频在线| 国产91久久婷婷一区二区| 日韩美女写真福利在线观看| 亚洲少妇激情视频| 欧美一区在线直播| yw.139尤物在线精品视频| 国产女人精品视频| 久久久久久久久久久网站| 欧美日本啪啪无遮挡网站| 性夜试看影院91社区| 91在线|亚洲| 欧美视频中文字幕在线| 91中文在线观看| 九九久久精品一区| 国产有码在线一区二区视频| 欧美极品美女电影一区| 亚洲开心激情网| 精品国产一区二区三区在线观看| 91亚洲精品在线| 国产一区二区丝袜高跟鞋图片| 高清欧美一区二区三区| 91国内揄拍国内精品对白| 成人午夜两性视频| 亚洲久久久久久久久久| 一本大道香蕉久在线播放29| 成人免费视频在线观看超级碰| 国产91免费观看| 亚洲在线免费视频| 日韩精品免费视频| 日韩的一区二区| 国产精品亚洲综合天堂夜夜| 欧美成人三级视频网站| 成年人精品视频| 国产精品丝袜白浆摸在线| 在线视频免费一区二区| 久久久女女女女999久久| 国产在线精品自拍| 狠狠色狠狠色综合日日五| 国产精品69久久久久| 国产精品亚洲аv天堂网| 国产日韩欧美成人| 国产精品久久久久不卡| 九九精品在线播放| 97国产精品久久| 国产精品久久精品| 亚洲精品美女在线观看播放| 国产欧美久久一区二区| 日韩中文在线中文网三级| 在线国产精品播放| 国产在线98福利播放视频| 日韩经典一区二区三区|