C++ std::istringstream如何不终止于'\0'

gudnpqoy  于 2023-11-19  发布在  其他
关注(0)|答案(1)|浏览(104)

有一个函数Foo,它接受一个char的输入流。我想从我的函数Bar调用Foo,它接受一个大小为char的C风格数组。char用于表示一个字节(不使用std::byte,因为很难让它处理流)。

void Foo(std::basic_istream<char>& stream) { /* ... */ }

// absl::Span<const char> in my code, using char pointer
// and size here for simplicity.
void Bar(const char * const arr, const size_t size) {
  std::basic_istream<char> stream = ArrToStream(arr, size);
  foo(stream);
}

字符串
我正在努力实现ArrToStream
如果我将std::ifstream的示例传递给Foo,一切都按预期工作。当涉及到ArrToStream时,似乎最推荐的方法就是像下面这样使用std::istringstream

std::basic_istream<char> ArrToStream(
  const char * const arr,
  const size_t size
) {
  return std::istringstream(arr, size);
}


然而,这只适用于数组中没有'\0'字符的情况。我的数据中有很多0字节,所以输入字符串流将它们视为null终止符并停止阅读流。我尝试调用stream.clear()stream.seekg(...),但到目前为止没有运气,字符串流只是拒绝读取过去的0。
有没有办法读取或忽略'\0'?如果没有,在C++20中表示字节流的最佳方法是什么?

6l7fqoea

6l7fqoea1#

不清楚(至少对我来说)你遇到了什么问题。用一个包含NUL字符的字符串初始化一个字符串流非常容易:

#include <sstream>
#include <cassert>
#include <string>
#include <iostream>

int main() { 
    // a string of 100 NUL characters
    std::string data(100, '\0');

    // initialize the stream from that string
    std::istringstream input (data);

    // initialize a string with other characters:
    std::string data_read(20, '1');

    // read data from stream:
    if (input.read(data_read.data(), 20))
        for (int i=0; i<20; i++) {
            // and assure that we read the NULs that we expected:
            assert(data_read[i] == '\0');
        }
    else
        std::cerr << "Read failed\n";
}

字符串
至少当我运行这个命令时,它成功了,这表明NULL被放置在流中,并且我们在之后成功地将它们读回。

相关问题