如何从ostringstream中获得char指针,而无需在c++中复制

how to get char pointer from ostringstream without a copy in c++

本文关键字:复制 c++ char ostringstream 指针      更新时间:2023-10-16

我有一个ostringstream变量,其中包含一些数据。我想设置一个char *指针指向ostringstream中的数据。

如果我做以下操作:

std::ostringstream ofs;
.....
const char *stam = (ofs.str()).c_str();

在ofs中有一个字符串内容的副本。我想要一个指向该内容的指针,而不需要复制。

有办法吗?

这实际上回答了这个问题…花了一段时间,但我想做同样的原因(效率vs可移植性对我的情况很好):

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;
}

这又一次指出了标准库更深层次的潜在问题——契约和"安全"之间的混淆。在编写消息传递服务时,我需要一个具有高效契约的库……不安全。其他时候,在编写UI时,我想要强大的安全性,而不太关心效率。

虽然不能在ostringstream中获得指向字符缓冲区的指针,但如果切换到使用stringstream,则可以访问其字符而无需复制它们。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

这个站点有一个很好的字符串流的概述,以及你可以用它们做什么。