檔案流是以外存檔案為輸入輸出物件的資料流,字串流不是以外存檔案為輸入輸出的物件,而以記憶體中使用者定義的字元陣列(字串)為輸入輸出的物件,即將資料輸出到記憶體中的字元陣列,或者從字元陣列(字串)將資料讀入。字串流也稱為記憶體流。
字串流也有相應的緩衝區,開始時流緩衝區是空的。如果向字元陣列存入資料,隨著向流插入資料,流緩衝區中的資料不斷增加,待緩衝區滿了(或遇換行符),一起存入字元陣列。如果是從字元陣列讀資料,先將字元陣列中的資料送到流緩衝區,然後從緩衝區中提取資料賦給有關變數。
在字元陣列中可以存放字元,也可以存放整數、浮點數以及其他型別的資料。在向字元陣列存入資料之前,要先將資料從二進位制形式轉換為ascii**,然後存放在緩衝區, 再從緩衝區送到字元陣列。從字元陣列讀資料時,先將字元陣列中的資料送到緩衝區,在賦給變數前要先將ascii**轉換為二進位制形式。總之,流緩衝區中的資料格式與字元陣列相同。這種情況與以標準裝置(鍵盤和顯示器)為物件的輸入輸出是類似的,鍵盤和顯示器都是按字元形式輸入輸出的裝置,記憶體中的資料在輸出到顯示器之前,先要轉換為 ascii碼形式,並送到輸出緩衝區中。從鍵盤輸入的資料以ascii碼形式輸入到輸入緩衝區,在賦給變數前轉換為相應變數型別的二進位制形式,然後賦給變數。對於字串流的輸入輸出的情況,如不清楚,可以從對標準裝置的輸入輸出中得到啟發。
檔案流類有ifstream,ofstream和fstream,而字串流類有istrstream,ostrstream和strstream。檔案流類和字串流類都是ostream,istream和iostream類的派生類,因此對它們的操作方法是基本相同的。向記憶體中的乙個字元陣列寫資料就如同向檔案寫資料一樣,但有3點不同:
輸出時資料不是流向外存檔案,而是流向記憶體中的乙個儲存空間。輸入時從記憶體中的儲存空間讀取資料。在嚴格的意義上說,這不屬於輸入輸出,稱為讀寫比較合適。 因為輸入輸出一般指的是在計算機記憶體與計算機外的檔案(外部裝置也視為檔案)之間 的資料傳送。但由於c++的字串流採用了 c++的流輸入輸出機制,因此往往也用輸入和輸出來表述讀寫操作。
字串流物件關聯的不是檔案,而是記憶體中的乙個字元陣列,因此不需要開啟和關閉檔案。
每個檔案的最後都有乙個檔案結束符,表示檔案的結束。而字串流所關聯的字元陣列中沒有相應的結束標誌,使用者要指定乙個特殊字元作為結束符,在向字元陣列寫入全部資料後要寫入此字元。
字串流類沒有open成員函式,因此要在建立字串流物件時通過給定引數來確立字串流與字元陣列的關聯。即通過呼叫建構函式來解決此問題。建立字串流物件的方法與含義如下。ostrstream類提供的建構函式的原型為:
ostrstream::ostrstream(char *buffer,int n,int mode=ios::out);
buffer是指向字元陣列首元素的指標,n為指定的流緩衝區的大小(一般選與字元陣列的大小相同,也可以不同),第3個引數是可選的,預設為ios::out方式。可以用以下語句建立輸出字串流物件並與字元陣列建立關聯:
ostrstream strout(ch1,20);
作用是建立輸出字串流物件strout,並使strout與字元陣列ch1關聯(通過字串流將資料輸出到字元陣列ch1),流緩衝區大小為20。
istrstream類提供了兩個帶參的建構函式,原型為:
istrstream::istrstream(char *buffer);
istrstream::istrstream(char *buffer,int n);
buffer是指向字元陣列首元素的指標,用它來初始化流物件(使流物件與字元陣列建立關聯)。可以用以下語句建立輸入字串流物件:
istrstream strin(ch2);
作用是建立輸入字串流物件strin,將字元陣列ch2中的全部資料作為輸入字串流的內容。
istrstream strin(ch2,20);
流緩衝區大小為20,因此只將字元陣列ch2中的,20個字元作為輸入字串流的內容。
strstream類提供的建構函式的原型為:
strstream::strstream(char *buffer,int n,int mode);
可以用以下語句建立輸入輸出字串流物件:
strstream strio(ch3,sizeof(ch3),ios::in|ios::out);
作用是建立輸入輸出字串流物件,以字元陣列ch3為輸入輸出物件,流緩衝區大小與陣列ch3相同。
以上個字串流類是在標頭檔案strstream中定義的,因此程式中在用到istrstream、ostrstream和strstream類時應包含標頭檔案strstream(在gcc中,用標頭檔案strstream)。
[例13.17] 將一組資料儲存在字元陣列中。
#include
using
namespace std;
struct
student
;int
main()
;char c[
50];
//使用者定義的字元陣列
ostrstream
strout
(c,30
);//建立輸出字串流,與陣列c建立關聯,緩衝區長
for(
int i=
0;i<
3;i++)
//向字元陣列c寫個學生的資料
strout
cout<<
"array c:"
/顯示字元陣列c中的字元
}
執行時在顯示器上的輸出如下:
array c:
1001li781002wang89.51004fun90
以上就是字元陣列c中的字元。可以看到:
1) 字元陣列c中的資料全部是以ascii**形式存放的字元,而不是以二進位制形式表示的資料。
2) 在建立字串流strout時指定流緩衝區大小為30位元組,與字元陣列c的大小不同,這是允許的,這時字串流最多可以傳送30個字元給字元陣列c。請思考:如果將流 緩衝區大小改為10位元組,即:
ostrstream.strout( c ,10);
運**況會怎樣?流緩衝區只能存放10個字元,將這10個字元寫到字元陣列c中。執行時顯示的結果是:
1001li7810
字元陣列c中只有10個有效字元。一般都把流緩衝區的大小指定與字元陣列的大小 相同。
3) 字元陣列c中的資料之間沒有空格,連成一片,這是由輸出的方式決定的。如果以後想將這些資料讀回賦給程式中相應的變數,就會出現問題,因為無法分隔兩個相鄰的資料。為解決此問題,可在輸出時人為地加入空格。如
for(int i=0;i<3;i++)
strout<<" "<
同時應修改流緩衝區的大小,以便能容納全部內容,今改為位元組。這樣,執行時將輸出:
1001 li 78 1002 wang 89.5 1004 fun 90
再讀入時就能清楚地將資料分隔開。
[例13.18] 在乙個字元陣列c中存放了個整數,以空格相間隔,要求將它們放到整型陣列中,再按大小排序,然後再存放回字元陣列c中。
#include
using
namespace std;
intmain()
ostrstream
strout
(c,sizeof
(c));
//建立輸出串流物件strout並與字元陣列c關聯
for(i=
0;i<
10;i++)
strout<" ";
//將個整數存放在字元陣列c
strout/加入'\\0'
cout<<
"array c:"
/顯示字元陣列c
return0;
}
執行結果如下:
array c: 12 34 65 -23 -32 33 61 99 321 32(字元陣列c原來的內容)
array a: 12 34 65 -23 -32 33 61 99 321 32 (整型陣列a的內容)
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字元輸出。它比外存檔案使用方便,不必建立檔案(不 需開啟與關閉),訪問速度快。但它的生命週期與其所在的模組(如主函式)相同,該模組的生命週期結束後,字元陣列也不存在了。因此只能作為臨時的儲存空間。
C 對字串流的讀寫
檔案流是以外存檔案為輸入輸出物件的資料流,字串流不是以外存檔案為輸入輸出的物件,而以記憶體中使用者定義的字元陣列 字串 為輸入輸出的物件,即將資料輸出到記憶體中的字元陣列,或者從字元陣列 字串 將資料讀入。字串流也稱為記憶體流。字串流也有相應的緩衝區,開始時流緩衝區是空的。如果向字元陣列存入資料,隨...
C 學習50 對字串流的讀寫
檔案流是以外存檔案為輸入輸出物件的資料流,字串流不是以外存檔案為輸入輸出的物件,而以記憶體中使用者定義的字元陣列 字串 為輸入輸出的物件,即將資料輸出到記憶體中的字元陣列,或者從字元陣列 字串 將資料讀入。字串流也稱為記憶體流。字串流也有相應的緩衝區,開始時流緩衝區是空的。如果向字元陣列存入資料,隨...
C 檔案流 字串流
include include include include include include using namespace std ifstream in void except catch int main char a,b string str,word,str1,str2 sssssss ...