我有一个包含一些数据的 ostringstream 变量。我想设置一个指向 ostringstream 中数据的 char * 指针。
如果我执行以下操作:
std::ostringstream ofs;
.....
const char *stam = (ofs.str()).c_str();
在 ofs 中有一个字符串内容的副本。我想在没有副本的情况下获得指向该内容的指针。
有没有办法这样做?
我有一个包含一些数据的 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;
}
这再次指出了标准库更深层次的潜在问题——合约和“安全”之间的混淆。在编写消息服务时,我需要一个具有高效合同的库……而不是安全性。其他时候,在编写 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
这个站点对字符串流以及你可以用它们做什么有一个很好的概述。