相关疑难解决方法(0)

如何使用FILE*写入内存缓冲区?

有没有办法将内存缓冲区创建为FILE*.在TiXml中它可以将xml打印到FILE*但我似乎无法将其打印到内存缓冲区.

c c++

39
推荐指数
5
解决办法
4万
查看次数

从(char*,size_t)创建C++内存流的简单方法,而不复制数据?

我找不到任何现成的东西,所以我想出了:

class membuf : public basic_streambuf<char>
{
public:
  membuf(char* p, size_t n) {
    setg(p, p, p + n);
    setp(p, p + n);
  }
}
Run Code Online (Sandbox Code Playgroud)

用法:

char *mybuffer;
size_t length;
// ... allocate "mybuffer", put data into it, set "length"

membuf mb(mybuffer, length);
istream reader(&mb);
// use "reader"
Run Code Online (Sandbox Code Playgroud)

我知道stringstream,但它似乎无法使用给定长度的二进制数据.

我在这里发明了自己的轮子吗?

编辑

  • 不能复制输入数据,只需创建迭代数据的东西.
  • 它必须是便携式的 - 至少它应该在gcc和MSVC下工作.

c++ memorystream

29
推荐指数
2
解决办法
5万
查看次数

将字符串移出std :: ostringstream

如果我构造一个由空格分隔的浮点值列表组成的字符串,使用std::ostringstream:

std::ostringstream ss;
unsigned int s = floatData.size();
for(unsigned int i=0;i<s;i++)
{
    ss << floatData[i] << " ";
}
Run Code Online (Sandbox Code Playgroud)

然后我得到一个结果std::string:

std::string textValues(ss.str());
Run Code Online (Sandbox Code Playgroud)

但是,这将导致不必要的字符串内容的深层副本,因为ss将不再使用.

有没有办法在不复制整个内容的情况下构造字符串?

c++ ostringstream move-semantics c++11

27
推荐指数
3
解决办法
3628
查看次数

C++:使用istream包装vector <char>

我想换一个vector<char>std::istream(所以读完载体将通过完成istream接口)

这样做的方法是什么?

c++

25
推荐指数
3
解决办法
1万
查看次数

将对象直接流入std :: string

给定一些可流式的类型:

struct X {
    int i;

    friend std::ostream& operator<<(std::ostream& os, X const& x) {
        return os << "X(" << x.i << ')';
    }
};
Run Code Online (Sandbox Code Playgroud)

我想把它添加到一个std::string.我可以这样实现:

void append(std::string& s, X const& x) {
    std::ostringstream os;
    os << x;
    s.append(os.str());
}
Run Code Online (Sandbox Code Playgroud)

但这似乎很蹩脚,因为我正在将数据写入一个流,然后为了将其附加到另一个流上而分配一个新的字符串.有更直接的路线吗?

c++ string

21
推荐指数
1
解决办法
2041
查看次数

20
推荐指数
4
解决办法
6311
查看次数

从内存缓冲区初始化C++ std :: istringstream?

我有一个内存块(不透明),我想通过他们的C++适配器存储在mySQL的Blob中.适配器需要一个istream:

virtual void setBlob(unsigned int parameterIndex, std::istream * blob) = 0;
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:如何从这个内存块创建一个std :: istream(键入为char*).它不是一个字符串,因为它不是以空值终止的(但我知道它的长度当然).

如果没有复制我的内存块,例如在std :: string中,我找不到一种方法.我认为这有点浪费.这样的东西不起作用:

    std::streambuf istringbuf(blockPtr, blockLength);
    std::istringstream tmp_blob(&istringbuf);
Run Code Online (Sandbox Code Playgroud)

因为std :: streambuf没有这样的构造函数.我看到了以下建议.

    std:: istringstream       tmp_blob;
    tmp_blob.rdbuf()->pubsetbuf(blockPtr, blockLength);
Run Code Online (Sandbox Code Playgroud)

这是正确的方法吗?

c++ streambuf

14
推荐指数
3
解决办法
1万
查看次数

stringstream-> rdbuf() - > pubsetbuf没有设置缓冲区

我试图修改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;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

You say goodbye
You say goodbye
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用stream.str(替换),但是这个方法复制'replace'的值,我不想复制.

我错过了什么?

更新:我正在使用VS2010

c++ stl stringstream stringbuffer

8
推荐指数
1
解决办法
2882
查看次数

c ++使用内存中的ifstream

我有一些代码用于ifstream从文件中读取一些数据,一切正常.

现在我希望,不修改一些代码,从内存中读取这些数据,实际上我有一个char *包含数据...

如何char *ifstream没有有效阅读文件的情况下将数据放入?

c++ ifstream memcpy

7
推荐指数
3
解决办法
7582
查看次数