尝试编译此代码时:
std::fstream file("file.name", std::ios::out | std::ios::binary);
uint8_t buf[BUFSIZE];
//Fill the buffer, etc...
file.write(buf, BUFSIZE);
编译器会警告我从调用到unsigned char
的oh-not-so-healthy 转换到. 事实上,它只是一个 typedef ,人们可能会认为使用而不是允许他们在没有警告的情况下编译上面的代码,正如预期的模板类型指针一样。char
write()
std::fstream
std::basic_fstream<char>
std::basic_fstream<uint8_t>
write()
这当然可行,但又出现了另一个问题。即使这段代码编译得很好:
std::basic_fstream<uint8_t> file("file.name", std::ios::out | std::ios::binary);
uint8_t buf[BUFSIZE];
//Fill the buffer, etc...
file.write(buf, BUFSIZE);
write()
即使以前的版本正在运行,它现在也会在调用 时失败(忽略编译器警告)。我花了一段时间来确定标准 C++ 库代码中异常是从哪里引发的,但我仍然不太明白这里的情况。它看起来std::basic_fstream
使用了一些字符编码机制,并且由于定义了一个 forchar
但没有定义 for unsigned char
,因此文件流在尝试使用“错误”字符数据类型时会默默地失败......至少我是这么看的。
但这也是我不明白的。不需要任何字符编码。我什至不以文本模式打开文件,我想处理二进制数据。这就是为什么我使用类型数组而uint8_t
不是 char 的原因,使用这种数据类型而不是普通的 old 感觉更自然char
。但在我决定放弃uint8_t
数据类型并接受使用char
缓冲区或开始使用byte
定义为 的自定义数据类型的数组之前char
,我想问两个问题:
- 究竟是什么机制阻止我使用无符号字符数据类型?它真的与字符编码有关,还是有其他用途?为什么文件流适用于有符号字符数据类型,但不适用于无符号数据类型?
- 假设我仍然想使用
std::basic_fstream<uint8_t>
,无论它多么(不)合理 - 有没有办法实现这一点?