#include "stdafx.h"
?
#include <iostream>
#include <fstream>
#include <sstream>
#include <iterator>
using namespace std;
#include <fstream>
#include <sstream>
#include <iterator>
using namespace std;
?
int main(int argc, char* argv[])
{
?ifstream ifs("test.txt");
?if(!ifs)
??return false;
{
?ifstream ifs("test.txt");
?if(!ifs)
??return false;
?
?ostringstream oss;
?istream_iterator<char> inpos(ifs);
?istream_iterator<char> endpos;
?ostream_iterator<char> out(oss);
?std::copy(inpos, endpos, out);
?string& szData = oss.str();?
?istream_iterator<char> inpos(ifs);
?istream_iterator<char> endpos;
?ostream_iterator<char> out(oss);
?std::copy(inpos, endpos, out);
?string& szData = oss.str();?
?
?const char * cc = szData.c_str();
//?cout << (long)szData << endl;
//?cout << (long)oss.str().c_str() << endl;
?cout<< cc;
//?cout << (long)szData << endl;
//?cout << (long)oss.str().c_str() << endl;
?cout<< cc;
?
?return 0;
}
}
?
??? 注意以上代碼中紅色部分沒有寫成:
??? const char * cc = oss.str().c_str(); // error
??? 要注意,oss.str()是值返回,所以這里會(huì)生成一個(gè)臨時(shí)變量,此時(shí)cc中的值是該臨時(shí)變量的內(nèi)存地址。所以當(dāng)此句執(zhí)行完成后,臨時(shí)變量被銷毀,cc便失效。
??? 所以要先對該臨時(shí)變量聲明一個(gè)引用,此時(shí)該臨時(shí)變量的生命周期便和szData一樣,所以這樣取到的cc所指向的內(nèi)存才是有效的。
首先:oss.str() 的返回值類型是 string,優(yōu)秀的編譯器是不允許 string& szData = oss.str() 編譯通過的,所以應(yīng)當(dāng)寫成
const string& szData = oss.str();
但最好寫成 string szData = oss.str();
后一種按照C++標(biāo)準(zhǔn)而言,和前一種效率一致,這就是C++規(guī)定的NRVO/RVO.
而const char * cc = szData.c_str()就更不用說了,持久化 c_str() 的值是無意義的,szData的值一旦修改,那么你持久化下來的cc就無意義了。
如果你想輸出最終oss的內(nèi)容就是:
cout << oss.str();
如果你想輸出當(dāng)前oss的內(nèi)容就是:
string szData = oss.str();
oss << ……oss繼續(xù)做它的事
cout << szData;