有一个函数
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 中表示字节流的最佳方式是什么?
不清楚(至少对我来说)您遇到了什么问题。使用包含 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 已放入流中,并且我们随后成功将它们读回。