std :: basic_ifstream抛出std :: bad_cast

时间:2013-07-13 07:57:40

标签: c++ file-io c++11 io ifstream

我正在尝试使用以下代码从文件中读取数据。 (请注意,您需要在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;
}

然而,在阅读数据时,我得到一个例外:

terminate called after throwing an instance of 'std::bad_cast'
  what():  std::bad_cast

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

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

有谁知道为什么抛出此异常?我怎么让它消失?

2 个答案:

答案 0 :(得分:3)

c ++ STL只包含两个char_traits特化:

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

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

this SO question

中的更多详情

答案 1 :(得分:2)

如果您将byte重新定义为charbad_cast例外将不再存在 发生。

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