如何从ostringstream中获得char指针,而无需在c++中复制
how to get char pointer from ostringstream without a copy in c++
我有一个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
这个站点有一个很好的字符串流的概述,以及你可以用它们做什么。
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 使用strcpy将char数组的元素复制到另一个数组
- 是否可以初始化不可复制类型的成员变量(或基类)
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 复制列表初始化的隐式转换的等级是多少
- 当从函数参数中的临时值调用复制构造函数时
- 有可能在Armadillo中复制MATLAB circshift方法吗
- 复制几乎为空的数组的最快方法
- 以下示例中如何避免代码复制?C++/库达
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 不能将复制初始化与隐式转换的多个步骤一起使用
- 当有分配器意识的容器被复制/移动时,反弹分配器是否被复制/移走
- 为什么复制而不是移动数据元素?
- 文件系统:复制功能的速度秘诀是什么
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 为什么类中的ostringstream类型的成员会导致";调用隐含删除复制构造函数";错误
- 使lambda不可复制/不可移动