C++ std::istringstream 如何不在“ ”处终止

问题描述 投票:0回答:1

有一个函数

Foo
,它接受
char
的输入流。我想从我的函数
Foo
调用
Bar
,它接受一个具有大小的 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 字节,因此输入字符串流将它们视为空终止符并停止读取流。我尝试调用
stream.clear()
stream.seekg(...)
但到目前为止没有运气,字符串流只是拒绝读取过去的 0。

有办法读取或忽略

'\0'
吗?如果没有,在 C++20 中表示字节流的最佳方式是什么?

c++ stream stringstream istringstream null-terminated
1个回答
0
投票

不清楚(至少对我来说)您遇到了什么问题。使用包含 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";
}

至少当我运行这个时,它成功了,表明 NUL 已放入流中,并且我们随后成功将它们读回。

© www.soinside.com 2019 - 2024. All rights reserved.