[英]Getting char* array from c++ stringstream ostringstream
[英]how to get char pointer from ostringstream without a copy in c++
我有一個包含一些數據的ostringstream變量。 我想設置一個指向ostringstream內部數據的char *指針。
如果我執行以下操作:
std::ostringstream ofs;
.....
const char *stam = (ofs.str()).c_str();
在ofs中有一個字符串內容的副本。 我希望得到一個沒有副本的指向該內容的指針。
有辦法嗎?
這實際上回答了這個問題...花了一段時間,但我想這樣做是出於同樣的原因(效率與便攜性對我的情況很好):
class mybuf : public std::stringbuf {
public:
// expose the terribly named end/begin pointers
char *eback() {
return std::streambuf::eback();
}
char *pptr() {
return std::streambuf::pptr();
}
};
class myos : public std::ostringstream {
mybuf d_buf;
public:
myos() {
// replace buffer
std::basic_ostream<char>::rdbuf(&d_buf);
}
char *ptr();
};
char *myos::ptr() {
// assert contiguous
assert ( tellp() == (d_buf.pptr()-d_buf.eback()) );
return d_buf.eback();
}
int main() {
myos os;
os << "hello";
std::cout << "size: " << os.tellp() << std::endl;
std::string dat(os.ptr(),os.tellp());
std::cout << "data: " << dat << std::endl;
}
這又指出了標准庫的深層次潛在問題 - 合同與“安全”之間的混淆。 在編寫消息服務時,我需要一個有效合同的庫...而不是安全。 其他時候,在編寫用戶界面時,我需要強大的安全性 - 並且不太關心效率。
雖然你無法獲得指向ostringstream中字符緩沖區的指針,但是如果你切換到使用stringstream,你可以訪問它的字符而不復制它們。 字符串流允許輸入和輸出(讀取和寫入流),而ostringstream僅允許輸出(寫入流)。 例:
std::stringstream ss;
ss << "This is a test.";
// Read stringstream from index 0. Use different values to look at any character index.
ss.seekg(0);
char ch;
while (ss.get(ch)) { // loop getting single characters
std::cout << ch;
}
ss.clear(); // Clear eof bit in case you want to read more from ss
這個網站非常好地概述了字符串流以及你可以用它們做些什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.