std::ios の例外処理

[戻る]
2009/12/28(月) 08:18:39
Visual Studio 2005 MFC です
ファイル読込み処理の、例外処理をこのようにしたところ、getline() 関数を
用いているので、当然のことなのですが、EOF の判定処理の部分で、
std::fstream::failbit が立ってしまいます、
このような場合の回避策、等があれば、アドバイスをご教示願えないでしょうか。

/**
 * @see ボタン押下でxxx.txt の内容をエディットボックスへ反映させる
 */
void CxxxDlg::OnBnClickedBtn1()
{
    std::string line;
    std::fstream fs;
    fs.exceptions(std::fstream::badbit | std::fstream::failbit);
    try {
        fs.open( "C:\\xxx.txt", std::ios::in );
        int row = 0;
        while( getline(fs, line) ) 
        {
            m_xvEditW[row] = line.c_str();
            ++row;
        }
        UpdateData(FALSE);
        fs.close();
    }
    catch(std::fstream::failure& e)
    {
        MessageBox(e.what());
    }
}

επιστημη [E-Mail] [HomePage] 2009/12/28(月) 08:24:18
> EOF の判定処理の部分で、
> std::fstream::failbit が立ってしまいます、
> このような場合の回避策、等があれば、

何を回避するんです?

- failbitが立たないようにするには?
- 立ったfailbitを寝かすには?
- ほかのなにか?

2009/12/28(月) 09:49:30
お世話になります、
回避というのは、ファイルの読み込みたいファイルがなかった場合、failbit で例外を捉
えたかったのですが、 while( getline(fs, line) )
この部分のループの最後の判定で、EOF が検出されるとともにfailbit が立ってしまいます
getline も使いたいし、failbit も使いたいという、二律背反的なことを行っていますが
この矛盾を正当な処理にしたいという意図です、
こんな場合はfailbit による例外処理は行わない方が吉なのでしょうか・・・?

επιστημη [E-Mail] [HomePage] 2009/12/28(月) 12:05:55
↓これじゃダメ?

    try {
        fs.open( "C:\\xxx.txt", std::ios::in );
        int row = 0;
        try {
            while( getline(fs, line) ) {
                m_xvEditW[row] = line.c_str();
                ++row;
            }
        } catch ( std::fstream::failure& e ) {
            if ( EOF以外の原因だった )
                throw;
        }
        UpdateData(FALSE);
        fs.close();
    }
    catch(std::fstream::failure& e)
    {
        MessageBox(e.what());
    }

subaru 2009/12/28(月) 12:49:21
>こんな場合はfailbit による例外処理は行わない方が吉なのでしょうか・・・?
failbitにこだわる必要は無いと思います。
自分で何らかの例外を投げてやった方がやりやすいのではないでしょうか。

    try {
        fs.open( "C:\\xxx.txt", std::ios::in );
        if(!fs.is_open()) {
            throw std::exception();
        }
        :

2009/12/28(月) 13:22:51
επιστημη sさん、subaru さんお世話になります。
επιστημη さんヒントありがとうございます、こんな感じで、できたと思います。・・・?
std::string line;
std::fstream fs;
std::ios_base::iostate state;
fs.exceptions(std::fstream::badbit | std::fstream::failbit |
    std::ios_base::eofbit);
try {
    fs.open( "C:\\regular.txt", std::ios::in );
    int row = 0;
    try {
        while( getline(fs, line) ) {
            m_xvEditW[row] = line.c_str();
            ++row;
            state = fs.rdstate();
        }
    } catch ( std::fstream::failure& e ) {
        if ( std::ios_base::eofbit == false )
            throw;
    }
    UpdateData(FALSE);
    fs.close();
}
catch(std::fstream::failure& e)
{
    MessageBox(e.what());
}


subaru さん、ありがとうございます、諦めかけてこんな風にも、やってみました。
try {
    fs.open("C:\\xxx.txt", std::ios::out);
    if(fs.fail())
        throw std::exception();
    }
    :

PATIO 2009/12/28(月) 17:08:56
直接、質問内容と関係なくて申し訳ないのですが、
ハンドルをコロコロ変えない方が良いと思います。
読んでいる方が混乱しますので。

επιστημη [E-Mail] [HomePage] 2009/12/28(月) 17:12:25
> 読んでいる方が混乱しますので。

てかちょっとムカついてます。失礼な奴。

2009/12/28(月) 17:34:36
[[解決]]
ハンドルが勝手に変わっていました、後で気づきました
失礼しましたなんで、眈 こんな文字が入っていたのかなぜなんだろ(読み方も分かりま
せん)?
Google の辞書のせいなんでしょうか?いずれにせよごめんなさいです、気をつけます。

2009/12/28(月) 17:39:09
あら、おかしい篝 (みぞれ)と入力したのに?
また、眈になっている、すみません、もう一度だけテストします。
篝
↑
みぞれ

眈
↑
みぞれと、入力して変わった文字

PATIO 2009/12/29(火) 11:53:12
うーむ、うわさのGoogleの変換ソフトですかね?

ちなみに「みぞれ」は「霙」です。
「みぞれ」のつもりで出ているのは篝(かがり)ですね。
でもって「眈」は、(にらむ・タン・トン)

あれも必ずしも望む結果を返してくれるわけじゃないみたいですしねぇ。

古いスレッドには追加発言できません。