C/C++中字符串流詳解及其作用介紹
概述
文件流類和字符串流類都是 ostream, istream 和 iostream 類的派生類, 因此對(duì)它們的操作方法是基本相同的.
字符串流
文件流 | 字符串流 | |
概念 | 文件流是以外存文件為輸入輸出對(duì)象的數(shù)據(jù)流 | 字符串流也 稱為內(nèi)存流, 以內(nèi)存中用戶定義的字符數(shù)組 (字符串) 為輸入輸出的對(duì)象 |
相關(guān)流類 | ifstream, ofstream 和 fstream | strstream |
頭文件 | ifstream, ofstream 和 fstream | strstream |
文件流類和字符串流類都是 ostream, istream 和 iostream 類的派生類, 因此對(duì)它們的操作方法是基本相同的.
理解字符串流
我們是輸入是字符串形式, 存放在緩沖區(qū)內(nèi). 在數(shù)據(jù)內(nèi)部是以二進(jìn)制的方式表示的. 所以輸出也是字符串形式的, 存儲(chǔ)在輸出緩沖區(qū)中.
#include <iostream> using namespace std; int main() { double m, n; char op; cin >> m >> op >> n; cout << m << " " << n << " " << op; return 0; }
輸出結(jié)果:
123.45 + 6789.10
123.45 6789.1 +
輸出字符串對(duì)象
字符串流類沒有open
成員函數(shù), 通過調(diào)用構(gòu)造函數(shù)建立字符串流對(duì)象.
ostream 類的構(gòu)造函數(shù)的原型:
ostrstream::ostrstream(char *buffer, int n, int mode=ios::out);
- buffer 是指向字符數(shù)組首元素的指針
- n 為指定的緩沖區(qū)的大小 (一般選與字符數(shù)組的大小相同)
- mode 指操作方式, 默認(rèn)為
ios::out
方式
建立輸出字符串流對(duì)象并與字符數(shù)組建立關(guān)聯(lián):
char ch1[20]; ostrstream strout(ch1, 20);
輸入字符串流對(duì)象
istrstream 類的兩個(gè)帶參的構(gòu)造函數(shù), 原型為:
istrstream::istrstream(char *buffer); istrstream::istrstream(char *buffer, int n);
- buffer 是指向字符數(shù)組首元素的指針, 用它來初始化流對(duì)象
- n 是緩沖區(qū)大小, 可以用字符數(shù)組中的一部分
建立輸入字符串流對(duì)象:
char ch2[40]; istrstream strin(ch2); // 將字符數(shù)組ch2中的全部數(shù)據(jù)作為輸入字符串流的內(nèi)容 istrstream strin(ch2,20); // 只將字符數(shù)組ch2中的前20個(gè)字符作為輸入字符串流的內(nèi)容
輸入輸出字符串流對(duì)象
strstream 類提供的構(gòu)造函數(shù)的原型為:
strstream::strstream(char *buffer, int n, int mode);
- buffer 是指向字符數(shù)組首元素的指針
- n 為指定的緩沖區(qū)的大小 (一般選與字符數(shù)組的大小相同)
- mode 指操作方式, 默認(rèn)為
ios::out
方式
舉個(gè)栗子:
char ch3[80]; strstream strio(ch3, sizeof(ch3), ios::in|ios::out);
案例一
寫字符數(shù)組:
#include <iostream> #include <strstream> #include "Student.h" using namespace std; int main( ) { // 定義數(shù)組 Student stud[3]= { {1001, "Little"}, {1002, "Mid"}, {1003, "Big"}, }; char c[50]; // 定義char數(shù)組存放字符流 ostrstream strout1(c, 30); for(int i = 0; i < 3; i++) strout1 << stud[i].id << stud[i].name; strout1 << ends; // ends是C++的I/O操作符,插入一個(gè)′\0′ cout << "array c:" << c << endl; ostrstream strout2(c, 40); for(int i = 0; i < 3; i++) strout2 << stud[i].id << " " << stud[i].name << " "; strout2 << ends; cout << "array c:" << c << endl; return 0; }
輸出結(jié)果:
array c:1001Little1002Mid1003Big
array c:1001 Little 1002 Mid 1003 Big
案例二
以字符串流為中介交換數(shù)據(jù):
#include <iostream> #include <strstream> using namespace std; int* bubble_sort(int array[10]); void display(int array[10]); int main() { // 定義數(shù)組 char c[50] = "23 45 56 -23 -32 33 61 99 88 77"; int a[10], *pt; // 輸入字符串流 cout << "array c: " << c << endl; istrstream strin(c, sizeof(c)); for (int i = 0; i < 10; i++) { strin >> a[i]; } // 調(diào)試輸出 cout << "array a: "; display(a); cout << endl; // 對(duì)數(shù)組 a 排序進(jìn)行冒泡排序 pt = bubble_sort(a); // 輸出字符串流 ostrstream strout(c, sizeof(c)); for (int i = 0; i < 10; ++i) { strout << *(pt+i) << " "; } cout << "array c: " << c << endl; return 0; }
輸出結(jié)果:
array c: 23 45 56 -23 -32 33 61 99 88 77
array a: 23 45 56 -23 -32 33 61 99 88 77
array c: -32 -23 23 33 45 56 61 77 88 99
字符數(shù)組 vs 文件
輸出時(shí)數(shù)據(jù)不是流向外存文件, 而是流向內(nèi)存中的一個(gè)存儲(chǔ)空間. 輸入時(shí)從內(nèi)存中的存儲(chǔ)空間讀取數(shù)據(jù).
字符串流對(duì)象關(guān)聯(lián)的不是文件, 而是內(nèi)存中的一個(gè)字符數(shù)組. 因此不需要打開和關(guān)閉文件.
每個(gè)文件的最后都有一個(gè)文件結(jié)束符, 表示文件的結(jié)束. 而字符流所關(guān)聯(lián)的字符數(shù)組中沒有相應(yīng)的結(jié)束標(biāo)志. 用戶要指定一個(gè)特殊字符 ends('\0') 作為結(jié)束符, 在向字符數(shù)組寫入全部數(shù)據(jù)后要寫入此字符.
總結(jié)
- 通過字符串流從字符數(shù)組讀數(shù)據(jù)就如同從鍵盤讀數(shù)據(jù)一樣, 可以從字符數(shù)組讀入字符數(shù)據(jù), 也可以讀入整數(shù), 浮點(diǎn)數(shù)或其他類型數(shù)據(jù)
- 同一字符數(shù)組可以先后與不同字符串流 (strin 或 strout) 建立關(guān)聯(lián). 分別對(duì)用一字符數(shù)組進(jìn)行操作, 甚至可以對(duì)字符數(shù)組交叉進(jìn)行讀寫
- 用輸出字符串流向字符數(shù)組些數(shù)據(jù)時(shí), 是從數(shù)組的首地址開始的, 因此更新了數(shù)組的內(nèi)容
- 與字符串流關(guān)聯(lián)的字符數(shù)組并不一定是專為字符串流而定義的數(shù)組, 可以對(duì)該數(shù)組進(jìn)行其他一般操作
- 與字符串流關(guān)聯(lián)的字符數(shù)組相當(dāng)于內(nèi)存中的臨時(shí)倉庫, 可以以 ASCII 形式存放各種類型的數(shù)據(jù), 在需要時(shí)再從中讀回來. 其他用法相當(dāng)于標(biāo)準(zhǔn)設(shè)備 (顯示器與鍵盤), 同時(shí)具有諸多好處
到此這篇關(guān)于C/C++中字符串流詳解及其作用介紹的文章就介紹到這了,更多相關(guān)C++字符串流內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++如何將一個(gè)vector內(nèi)容賦值給另一個(gè)vector,及swap與assign區(qū)別
在本文中,我們將主要介紹5種將一個(gè)vector內(nèi)容賦值給另一個(gè)vector的方式,順便討論下swap與assign的區(qū)別,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08為什么要學(xué)習(xí)C語言 C語言優(yōu)勢(shì)分析
不止一個(gè)學(xué)生問到我:“老師,為什么我們的應(yīng)用程序設(shè)計(jì)要學(xué)C語言而不是別的?C語言不是已經(jīng)過時(shí)了嗎?如果現(xiàn)在要寫一個(gè)Windows程序,用VB或Dephi開發(fā)多快呀,用C行嗎?退一萬步,為什么選擇C而不是C++呢?”2013-07-07VC中實(shí)現(xiàn)GB2312、BIG5、Unicode編碼轉(zhuǎn)換的方法
這篇文章主要介紹了VC中實(shí)現(xiàn)GB2312、BIG5、Unicode編碼轉(zhuǎn)換的方法,該功能非常實(shí)用,需要的朋友可以參考下2014-07-07斐波那契數(shù)列 優(yōu)化矩陣求法實(shí)例
斐波那契數(shù)列 優(yōu)化矩陣求法實(shí)例,需要的朋友可以參考一下2013-03-03