Tho*_*eod 3 c++ iostream stl widechar
我想将非Unicode,16位字写入文件,稍后再读回.我知道有一些字节操作,我可以在char模式下使用fstream::read()和fstream::write().直接使用16位字需要做什么?
例如,我似乎应该能够做到以下几点:
basic_ofstream<uint16_t> aw;
aw.open("test.bin", ios::binary);
uint16_t c[] = {0x55aa, 0x1188};
aw.write(c, 2);
aw.close();
basic_ifstream<uint16_t> ax;
ax.open("test.bin", ios::binary);
uint16_t ui[2];
ax.read(ui, 2);
ax.close();
cout << endl << hex << unsigned(ui[0]) << " " << unsigned(ui[1]) << endl;
Run Code Online (Sandbox Code Playgroud)
gcc 4.4输出:
d 0
Run Code Online (Sandbox Code Playgroud)
Vc ++ 10输出:
CCCC CCCC
Run Code Online (Sandbox Code Playgroud)
我也试过std::basic_filebuf<uint16_t>直接使用并得到了相同的结果.为什么?
我真的很惊讶你有实例化的流来做任何阅读!结果可能是实现定义的(即,您可能会发现编译器文档中描述的行为),但可能只是未指定(尽管未完全未定义).我不认为流类都必须支持实例用于其他类型的比char并wchar_t立即,即,不向用户提供至少一些方面的.
标准流类是字符类型上的模板,但对于任何不受支持的类型都不容易实例化.至少,您需要std::codecvt<int16_t, char, std::mbstate_t>在byte中的外部表示和内部表示之间实现合适的facet转换.从它的外观来看,您尝试的两个系统为其默认实现做出了不同的选择.
std::codecvt<internT, externT, stateT>是用于在字符的外部表示和字符的内部表示之间进行转换的方面.流只需要支持char哪个被认为表示字节作为外部类型externT.内部字符类型internT可以是任何整数类型,但转换需要通过实现代码转换方面来定义.如果我没有记错,流还可以假设状态类型stateT是std::mbstate_t(这实际上是有点问题,因为没有这种类型定义的接口!).
除非您真的致力于为字符类型创建I/O流,否则您uint16_t可能希望使用字节读取字节std::ifstream并将其转换为字符类型.类似地写字符.要真正创建一个也支持格式化的I/O流,你也需要许多其他方面(例如std::ctype<uint16_t>,std::num_punct<uint16_t>),你需要构建一个std::locale包含所有这些以及一些可以从中实例化的方面.标准库的实现(例如,std::num_get<uint16_t>和std::num_put<uint16_t>;我认为它们的迭代器类型是合适的默认值).