2

我正在尝试将我自己的codecvt与标准 iostream 一起使用。我正在使用这条线:

std::cout.imbue(std::locale(std::locale("C"), new rot13codecvt()));

rot13codecvt只是一个例子,无耻地从互联网上逐字 删除。一个完整的可运行示例在这里。我真正的 codecvt 做了一些不同的事情。

正如您在链接的实时示例中看到的那样,这在 g++中不太适用。输出不是 rot13d。从未调用自定义 codecvt 类中的函数。但它在 VS2012 中运行良好。

我已经尝试过“C”之外的其他语言环境,但没有一个有效。还尝试了一个例子here,同样的结果。

我究竟做错了什么?

4

3 回答 3

2

只需要使用文件流,std::codecvt<...>并且不要求任何标准流对象都以文件流的形式实现。两种选择的实施者都有其原因。Dinkumware 的实现<stdio.h>用于其大部分操作,在这种情况下,在后台使用相同的实现是有意义的。libstdc++ 避免了一些开销并直接访问标准 C 和 C++ 流之间共享的缓冲区,因此使用不同的流实现。

使用文件流时,std::codecvt<...>构面的使用应该是一致的。

于 2015-02-04T13:51:27.363 回答
2

从 gcc 5.1 开始存在 codecvt 标头。

于 2017-10-18T20:07:21.713 回答
0

g++ 提供的 libstdc++ 还没有实现 c++11 标准。在我的版本中,<codecvt>标题完全丢失。

f.jardon@xxxx 14:40:40 ~
$ find /usr/lib/gcc/x86_64-pc-cygwin/4.9.2/ -name codecvt

f.jardon@xxxx 14:41:17 ~

这不是唯一缺少的东西:

f.jardon@xxxx 14:46:22 ~
$ grep -rl wbuffer_convert 'c:/Program Files (x86)/Microsoft Visual Studio 12.0/VC/include/'
c:/Program Files (x86)/Microsoft Visual Studio 12.0/VC/include/cvt/wbuffer
c:/Program Files (x86)/Microsoft Visual Studio 12.0/VC/include/cvt/xtest
c:/Program Files (x86)/Microsoft Visual Studio 12.0/VC/include/xlocbuf

f.jardon@xxxx 14:46:25 ~
$ grep -rl wbuffer_convert /usr/lib/gcc/x86_64-pc-cygwin/4.9.2/include/c++/
于 2015-02-04T13:43:11.500 回答