如何将 std::istream 转换为 std::wistream
How to convert a std::istream to std::wistream
我有一个 istream,有些代码需要一个 wistream。
我真的希望源流零的每个字符都扩展到wchar_t。 我不关心代码页,我不关心本地化,我只想无缝地通过管道传输这个输入,最快的方法是什么?
您可以编写读取缓冲区以使istream
中的底层流缓冲区适应您的wistream
:
class adapting_wistreambuf : public wstreambuf {
streambuf *parent;
public:
adapting_istreambuf(streambuf *parent_) : parent(parent_) { }
int_type underflow() {
return (int_type)parent->snextc();
}
};
后:
istream &somestream = ...;
adapting_wistreambuf sb(somestream.rdbuf());
wistream wistream(&sb);
// now work with wistream
这只实现了 streambof 接口的最低限度。如果需要,可以添加缓冲区管理代码以提高性能。
我认为如果不在std::wistream
周围编写复杂的*包装器来提供std::istream
接口,这是不可能的。两者之间的区别在于从模板实例化这些类时使用的 char 类型,从而使std::istream
(char_type = char
( 和 std::wistream
(char_type = wchar_t
( 在两个不同的类层次结构中。它们仅将 std::ios_base 共享为公共基类,这不会为您当前的问题提供有用的东西。
因此,以下代码段将无法编译(它尝试将 s2 的内部std::streambuf
替换为 s1 的内部,从而使 s2 上的 I/O 操作对文件中的数据执行(:
std::wifstream s1 ;
std::istringstream s2 ;
// assuming s1 and s2 are correctly initialized ...
s2.ios::rdbuf(s1.rdbuf()) ; // will not compile, unfortunately, unless the char type
// is the same for the two streams :(
我不知道一个简单的解决方案,也许可以使用Boost IOStreams过滤器(我从未尝试过:((。
如果您不处理二进制数据,并且流长度不是太大,请尝试将所有数据读取为字符串,然后将(如您所说为零扩展(转换为std::wistringstream
。
* : 复杂意味着您对 std::streams 有合理的了解。我承认我对溪流不舒服。
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- std::condition_variable::wait()如何评估给定的谓词
- 如何获取std::result_of函数的返回类型
- std::原子加载和存储都需要吗
- 将对象移动到std::shared_ptr
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 使用一个考虑到std::map中键值的滚动或换行的键
- 如何从 std::atomic 中提取指针 T<T>?
- 为什么 std::unique 不调用 std::sort?
- 使用std::函数映射对象方法
- 如何将 std::istream 转换为 std::wistream