簡體   English   中英

如何在沒有c ++副本的情況下從ostringstream獲取char指針

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM