【问题标题】:c++ streaming into char array?c ++流式传输到char数组中?
【发布时间】:2013-04-27 20:13:40
【问题描述】:

我目前正在开发一个 c++ 应用程序,该应用程序正在使用一个 c 库,该库需要从我这边实现一个回调 例如回调定义如下:

int onWrite(char *what, char *buffer, size_t size, off_t offset);

我有 std::set 需要格式化并写入缓冲区并处理大小和偏移量,其中大小是缓冲区的大小和偏移量已经处理了多少字节

有没有一种 c++ 方法可以让我像流一样进入缓冲区? 我在想这样的事情:

SomeSTLStandardStream stream(buffer,size);
stream.ignore(offset);  // to drop the first n offset bytes
for(it=dataset.begin();it!=dataset.end() && stream.buffer_avail()>0;it++)
    stream << *it << "|"; // format csv like for example

我的核心问题是:是否有一种标准的 c++ 方法来抓取一段格式化/流式数据并写入给定的缓冲区?

如果没病就得自己实现

我还查看了 stringstream,但它似乎不完全符合我的需求,因为它使用自己的写缓冲区而不是我的 而且我也不知道已经写入了多少字节等等......

谢谢

【问题讨论】:

  • std::ostrstream;它已被弃用,但它可能适合您的场景。

标签: c++ arrays stream char


【解决方案1】:

您可以使用std::stringstream::pubsetbuf 分配内存并将其包装在字符串流中:

 int main()
 {
    char buf[1024];

    std::stringstream stream;

    stream.rdbuf()->pubsetbuf(buf, sizeof(buf));

    stream<< "Hello " << "World " << std::endl;

    std::string str;
    std::getline(stream, str);
    std::cout << str << std::endl;

    //...
}

阅读std::stringstreamstd::basic_streambufstd::basic_stringbuf

【讨论】:

  • 我已经看过 pubsetbuf。我遇到的问题是我不知道是否或有多少字节真正写入了我的 buf。例如,如果您将缓冲区大小设置为 char buf[3]={'\0'};与 pubsetbuf(buf,2);然后做 rdbuf()->sputn("ab",2); rdbuf()->sputn("bb",2);两个 sputn 的返回值将表明一切正常,但实际上只有第一个已写入我的 buf(不知道第二个去了哪里?) - 那么我怎么知道:何时停止写入?我的 buf 已经写入了多少字节?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多