首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 基礎

C++ 字串流深度解析:記憶體中的高效資料讀寫

     編輯:C++ 基礎

什麼是字串流?

字串流不以磁碟檔案為對象,而是以記憶體中的字元陣列為輸入/輸出目標。資料以 ASCII 碼形式在記憶體緩衝區與字元陣列間流動,因此也稱為記憶體流。其操作方式與檔案流、標準輸入輸出流高度一致,極大降低學習成本。

核心類別與建立方式

定義於 <strstream> 標頭檔:

  • ostrstream:輸出字串流(記憶體 → 字元陣列)
  • istrstream:輸入字串流(字元陣列 → 記憶體)
  • strstream:雙向字串流

建立輸出流

char buffer[50];
ostrstream strout(buffer, 30); // 緩衝區 30 位元組,關聯 buffer

建立輸入流

char data[] = "12 34 56";
istrstream strin(data);          // 全部內容
istrstream strin2(data, 5);      // 僅前 5 字元

建立雙向流

char buf[100];
strstream strio(buf, sizeof(buf), ios::in | ios::out);

關鍵差異:字串流 vs 檔案流

  1. 非真正 I/O:資料在記憶體內部流動,無磁碟存取
  2. 無需開啟/關閉:建立物件即隱含關聯
  3. 無 EOF 標記:需自行插入結束符(如 ends 插入 '\0')

實戰範例:結構體序列化與反序列化

寫入字串流

struct Student { int num; char name[20]; float score; };
Student stud[3] = {{1001,"Li",78}, {1002,"Wang",89.5}, {1004,"Fun",90}};
char c[50];
ostrstream strout(c, sizeof(c));
for (int i=0; i<3; ++i)
    strout << stud[i].num << ' ' << stud[i].name << ' ' << stud[i].score;
strout << ends; // 必須加結束符
cout << "array c: " << c << endl;
// 輸出: 1001 Li 78 1002 Wang 89.5 1004 Fun 90

讀取、排序、回寫

char c[50] = "12 34 65 -23 -32 33 61 99 321 32";
int a[10];
istrstream strin(c, sizeof(c));
for (int i=0; i<10; ++i) strin >> a[i]; // 自動按空格分隔讀取整數

// 冒泡排序
for (int i=0; i<9; ++i)
    for (int j=0; j<9-i; ++j)
        if (a[j] > a[j+1]) swap(a[j], a[j+1]);

ostrstream strout(c, sizeof(c));
for (int i=0; i<10; ++i) strout << a[i] << ' ';
strout << ends;
cout << "sorted: " << c << endl;
// 輸出: -32 -12 32 33 34 61 65 99 321

進階特性與注意事項

  • 多流並行:可同時建立輸入/輸出流操作同一陣列,各自維護獨立指標,互不干擾
  • 覆寫特性:輸出流從陣列首地址開始寫入,會覆蓋原有內容
  • 通用陣列:關聯陣列可為普通字元陣列,不影響其他操作
  • 緩衝區大小:建議與陣列大小一致,過小會截斷資料
  • 生命週期:隨所在作用域結束而釋放,僅適合暫存資料

總結

字串流是記憶體中的「臨時倉庫」,以 ASCII 形式存儲多型別資料,讀寫靈活、速度極快、無檔案管理開銷。掌握它能優化暫存資料處理、字串解析、序列化等場景,是 C++ 高效程式設計的利器。

  1. 上一篇文章: No
  2. 下一篇文章:
  • --热点文章
  • Copyright © 程式碼之家 All Rights Reserved