5

我正在尝试使用以下代码从文件中读取数据。(请注意,您需要在 GCC 上启用 C++11 功能才能编译。)

#include <fstream>

typedef unsigned char byte;

int main()
{
    std::string filename = "test.cpp";
    std::basic_ifstream<byte> in(filename, std::basic_ifstream<byte>::in | std::basic_ifstream<byte>::binary);
    in.exceptions(std::ios::failbit | std::ios::badbit);
    byte buf[5];
    in.read(buf, 5);
    return 0;
}

但是,在读取数据时出现异常:

在抛出 'std::bad_cast' 的实例后调用终止
  什么():std::bad_cast

in.read(buf, 5)调用命令时会发生这种情况。

我知道我可以通过不设置我设置的异常掩码来抑制此异常,但这并不能解决问题,它只会掩盖它。如果没有异常掩码,代码将继续工作,但会读取 0 个字符。

有谁知道为什么会抛出这个异常?我如何让它消失?

4

2 回答 2

5

c++ STL 仅包含 char_traits 的两个特化:

   struct char_traits < char >;
   struct char_traits <wchar_t >;

对于发布到工作的代码,char_traits<byte>需要定义。

此 SO 问题中的更多详细信息

于 2013-07-13T08:49:07.147 回答
3

如果重新定义byte为异常charbad_cast不再发生。

我认为basic_ifstream模板没有针对 unsigned char专业化进行完全调试。根据标准§ 27.3, char_traits<CharType>只需要由库实例化为CharType={char|char16_t|char32_t|wchar_t}

于 2013-07-13T08:48:07.877 回答