2009-01-31 66 views
16

什麼是獲取字符串或char *指針到一個istream的最佳方式。獲取字符串或char *到istream中的最佳方法?

我想要做以下

std::string a = "abc.."; 

//I know this can be done, not sure if this is most efficient 
// and not sure about char* pointers 
std::istringstream istr (a); 
... 
foo (istr); 


void foo(std::istream& is) { 

} 
+0

對不起;這並不完全清楚你在這裏問什麼。你想能夠訪問一個字符串,就好像它是一個流?你想達到什麼目的? – Rob 2009-01-31 19:25:39

+0

現在編輯了這個問題。 – kal 2009-01-31 19:31:52

回答

12

這將工作:

std::istringstream is("abc..."); 

而且由於istringstream是istream的,你就可以用你的對象作爲一個IStream。

15

如果你想從它構建istringstream,一個char *到空字符,或從的std :: string所有的東西:

istringstream str(ptr); // char* 
istringstream str(other_str); // std::string 

如果說起想要一個原始指針進入一個istream的緩衝區,你不能這樣做。如果流需要文件,終端或其他內容,可以選擇緩衝它們的內容,那麼Streams會按需提供數據(不完全正確,你可以使用strstream,它接受一個原始指針並直接讀取/寫入數據。這是一個棄用的課程 - 不要使用它,我很幸運,我從來沒有這樣做過)。如果所有你想要的東西都可以像指針一樣使用,你可以使用streambuf迭代器。他們是不是真的指針的,所以你不能從begin和其他東西減去end

std::istreambuf_iterator<char> begin(one_istream), end; 
while(begin != end) 
    std::cout << *begin++; 

如果你談論得到一個字符串,出了什麼事情被寫入一個字符串流,你可以使用ostringstream::str

ostringstream o; 
o << "This is a number: " << 42; 
std::string str = o.str(); // str == "This is a number: 42" 

否則,你只能通過閱讀東西從istream。你需要一個ostream,那麼你可以做

stream.write(ptr, N); 
stream.write(ptr.c_str(), ptr.c_str() + ptr.size()); 

寫入從字節是STR分,正好N個字符。您也可以使用<<將它寫入流中。它會將所有內容寫入空字符或std :: string中的所有內容,但會尊重格式化標誌,如字段寬度:

stream << ptr; // char* 
stream << other_str; // everything from std::string 
相關問題