我可以使用 std::ostream 打印到给定的缓冲区吗?
Can I use an std::ostream to print into a given buffer?
我有一个给定的字符缓冲区(甚至可能是支持 std::string
的缓冲区,但没关系)。我想使用 std::ostream
打印到该缓冲区,即我希望能够写:
span<char> my_buffer = get_buffer();
auto my_os = /* magic */;
static_assert(
std::is_base_of<std::basic_ostream<char>,decltype(my_os)>::value,
"magic failed");
my_os << "hello" << ',' << 123 << '[=11=]';
std::cout << my_buffer << '\n';
并得到:
hello,123
在标准输出上。
注意:C++11 如果可能,请注明您使用的语言标准。 (是的,我知道 C++11 没有跨度。)
(感谢@BoP 和@T.C。对于这个解决方案的两个部分)
这可以做到...如果您愿意使用已弃用的 C++ 构造:std:ostrstream
.
#include <strstream>
#include <iostream>
int main() {
const size_t n = 20;
char my_buffer[n];
std::ostrstream my_os(my_buffer, n);
my_os << "hello" << ',' << 123 << '[=10=]';
std::cout << my_buffer << '\n';
}
关于这段代码的注释:
- 它 works (GodBolt)
- C++98有效! ...当然我不得不放弃
std::span
、auto
类型推断等。它也是有效的 C++11 和更高版本的标准。
- 这将从您的字符缓冲区构造一个
std::strstreambuf
,这是 std::ostrstream
直接使用的。
不幸的是,随着 std::ostrstream
的弃用,我们没有 fully-valid 替代方案,包括 C++20。您需要实现自定义 std::basic_streambuf
,并将其分配给 std::ostream
。 :-(
但是在 C++23 - 你很幸运!标准库确实完全提供了您所要求的:std::spanstream
:一个std::ostream
由char
的跨度支持,它在建筑。
我有一个给定的字符缓冲区(甚至可能是支持 std::string
的缓冲区,但没关系)。我想使用 std::ostream
打印到该缓冲区,即我希望能够写:
span<char> my_buffer = get_buffer();
auto my_os = /* magic */;
static_assert(
std::is_base_of<std::basic_ostream<char>,decltype(my_os)>::value,
"magic failed");
my_os << "hello" << ',' << 123 << '[=11=]';
std::cout << my_buffer << '\n';
并得到:
hello,123
在标准输出上。
注意:C++11 如果可能,请注明您使用的语言标准。 (是的,我知道 C++11 没有跨度。)
(感谢@BoP 和@T.C。对于这个解决方案的两个部分)
这可以做到...如果您愿意使用已弃用的 C++ 构造:std:ostrstream
.
#include <strstream>
#include <iostream>
int main() {
const size_t n = 20;
char my_buffer[n];
std::ostrstream my_os(my_buffer, n);
my_os << "hello" << ',' << 123 << '[=10=]';
std::cout << my_buffer << '\n';
}
关于这段代码的注释:
- 它 works (GodBolt)
- C++98有效! ...当然我不得不放弃
std::span
、auto
类型推断等。它也是有效的 C++11 和更高版本的标准。 - 这将从您的字符缓冲区构造一个
std::strstreambuf
,这是std::ostrstream
直接使用的。
不幸的是,随着 std::ostrstream
的弃用,我们没有 fully-valid 替代方案,包括 C++20。您需要实现自定义 std::basic_streambuf
,并将其分配给 std::ostream
。 :-(
但是在 C++23 - 你很幸运!标准库确实完全提供了您所要求的:std::spanstream
:一个std::ostream
由char
的跨度支持,它在建筑。