C++基礎::Stream

Inside_Zhang發表於2015-11-18

標準I/O庫類繼承體系


io

對應關係:

  • istream,ifstream,istringstream
  • ostream,ofstream,ostringstream
  • iostream,fstream,stringstream

從上圖我們可以看到,stringstream兼具istringstream(從字串流中讀資料)ostringstream(向字串流中寫資料)的功能(它們三者的標頭檔案均位於<sstream>),既然如此我們是不是在任何istringstreamostringstream出現的地方替換為stringstream(任何istreamostream出現的地方替換為iostream,三者的標頭檔案均位於<iostream)呢。然而事實上並沒有這麼做。

既從一個字串中讀又從中寫資料是一件古怪(且很少發生)的行為1

std::stringstream ss;
ss << "hello world ";
                        // world 後要有至少有一個空格,
ss << 42;
std::string str1, str2; int i;
                // 流以空格為分割,且忽略冗餘空格
ss >> str1 >> str2 >> i;
std::cout << str1 << str2 << str3 << std::endl;

流的好處

流的好處在於無論何種基本資料型別都可丟到流中,且很方便再重新取出賦值,這是字串型別所做不到的。

#include <stdlib.h>
                        // _itoa
                        // 進行windows平臺下的編譯器
std::stringstream ss;
ss << "hello world " << 42;
std::string str1, str2; int i;
ss >> str1 >> str2 >> i;

std::string s;
int i = 42;
s += "hello world ";
char arr[5];
_itoa(i, arr, 10);
s += arr;
                                // 較為囉嗦和複雜

good()

判斷檔案開啟是否成功:

std::ofstream ofs("./1.txt");
assert(ofs.good());
        // 檔案開啟成功時,good()返回值為true
        // 否則為false

返回值型別

C++ 中的 string 型別定義:

typedef basic_string<char, char_traits<char>, allocator<char> >
    string;
  • 對 string 型別的 s 而言,s.c_str():string ==》 char*

  • 對流型別的 s 而言,s.str():stream ==》 string

References

[1] <C++標準I/O庫:iostream, fstream, sstringstream>

相關文章