41806


以下のようなコードでファイルオープンエラーを検出したいです。

[code]

    #include <iostream>
    #include <fstream>
    
    int main()
    {
        std::ofstream fout;
    
        try
        {
            fout.exceptions(std::ofstream::failbit);
            fout.open("/tmp/hoge/hoge.txt");
        }
        catch(const std::ofstream::failure e)
        {
            std::cout << "msg=" << e.what() << std::endl;
        }
    
        return 0;
    
    }
    
[/code]

実行結果は、

[code]

    $ ./a.out
    msg=basic_ios::clear
    
[/code]

となります。

[code]

    msg=basic_ios::failbit
    
[/code]

のような結果を期待しているのですが、なぜbasic_ios::clearになるのでしょうか？  
それとも私の実装方法に間違いがあるのでしょうか？


CC BY-SA 3.0
2018-02-16T01:27:41.917
41757
2018-02-17T06:48:39.237
2018-02-16T03:48:36.177
15147
15147
question
c++ c++11
ofstreamのopen失敗時の例外メッセージは、なぜbasic_ios::clearになるのでしょうか？


`std::ios_base::failure::what()`が[どんなメッセージを返すのか](https://cpprefjp.github.io/reference/ios/basic_ios/exceptions.html)は決まっていないので、標準ライブラリの実装依存です。

[gcc 7.2.0の場合](https://wandbox.org/permlink/FDtRzu3FoITc8jvN)：

> msg=basic_ios::clear: iostream error

[clang 5.0.0の場合](https://wandbox.org/permlink/xsR8XX1CQnZAJPOp)：

> msg=ios_base::clear: unspecified iostream_category error

Visual C++ 2017の場合：

> msg=ios_base::failbit set: iostream stream error


CC BY-SA 3.0
2018-02-17T06:48:39.237
41806
2018-02-17T06:48:39.237
7291
41757
answer