有没有办法将内存缓冲区创建为FILE*.在TiXml中它可以将xml打印到FILE*但我似乎无法将其打印到内存缓冲区.
我找不到任何现成的东西,所以我想出了:
class membuf : public basic_streambuf<char>
{
public:
  membuf(char* p, size_t n) {
    setg(p, p, p + n);
    setp(p, p + n);
  }
}
用法:
char *mybuffer;
size_t length;
// ... allocate "mybuffer", put data into it, set "length"
membuf mb(mybuffer, length);
istream reader(&mb);
// use "reader"
我知道stringstream,但它似乎无法使用给定长度的二进制数据.
我在这里发明了自己的轮子吗?
编辑
如果我构造一个由空格分隔的浮点值列表组成的字符串,使用std::ostringstream:
std::ostringstream ss;
unsigned int s = floatData.size();
for(unsigned int i=0;i<s;i++)
{
    ss << floatData[i] << " ";
}
然后我得到一个结果std::string:
std::string textValues(ss.str());
但是,这将导致不必要的字符串内容的深层副本,因为ss将不再使用.
有没有办法在不复制整个内容的情况下构造字符串?
我想换一个vector<char>与std::istream(所以读完载体将通过完成istream接口)
这样做的方法是什么?
给定一些可流式的类型:
struct X {
    int i;
    friend std::ostream& operator<<(std::ostream& os, X const& x) {
        return os << "X(" << x.i << ')';
    }
};
我想把它添加到一个std::string.我可以这样实现:
void append(std::string& s, X const& x) {
    std::ostringstream os;
    os << x;
    s.append(os.str());
}
但这似乎很蹩脚,因为我正在将数据写入一个流,然后为了将其附加到另一个流上而分配一个新的字符串.有更直接的路线吗?
你知道,有评论,例子和东西.
编码时需要快速参考.
我有一个内存块(不透明),我想通过他们的C++适配器存储在mySQL的Blob中.适配器需要一个istream:
virtual void setBlob(unsigned int parameterIndex, std::istream * blob) = 0;
所以我的问题是:如何从这个内存块创建一个std :: istream(键入为char*).它不是一个字符串,因为它不是以空值终止的(但我知道它的长度当然).
如果没有复制我的内存块,例如在std :: string中,我找不到一种方法.我认为这有点浪费.这样的东西不起作用:
    std::streambuf istringbuf(blockPtr, blockLength);
    std::istringstream tmp_blob(&istringbuf);
因为std :: streambuf没有这样的构造函数.我看到了以下建议.
    std:: istringstream       tmp_blob;
    tmp_blob.rdbuf()->pubsetbuf(blockPtr, blockLength);
这是正确的方法吗?
我试图修改stringstream对象的stringbuffer而不必复制字符串,使用方法pubsetbuf,但它无法正常工作.我正在关注http://www.cplusplus.com/reference/iostream/streambuf/pubsetbuf/中的文档.这是我的示例代码:
#include <iostream>
#include <sstream>
int main(int argc, char* argv[])
{
    std::stringstream stream("You say goodbye");
    char replace[] = {"And I say hello"};
    std::cout << stream.str() << std::endl; // Checking original contents
    stream.rdbuf()->pubsetbuf(replace, 16); // Should set contents here
    std::cout << stream.str() << std::endl; // But don't :(
    return 0;
}
输出是:
You say goodbye
You say goodbye
我知道我可以使用stream.str(替换),但是这个方法复制'replace'的值,我不想复制.
我错过了什么?
更新:我正在使用VS2010
我有一些代码用于ifstream从文件中读取一些数据,一切正常.
现在我希望,不修改一些代码,从内存中读取这些数据,实际上我有一个char *包含数据...
如何char *在ifstream没有有效阅读文件的情况下将数据放入?
c++ ×9
stl ×2
c ×1
c++11 ×1
ifstream ×1
memcpy ×1
memorystream ×1
reference ×1
streambuf ×1
string ×1
stringbuffer ×1
stringstream ×1