std::ios の例外処理 – プログラミング – Home

通知
すべてクリア

[解決済] std::ios の例外処理


菎
 菎
(@菎)
ゲスト
結合: 15年前
投稿: 1
Topic starter  

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());
}
}


引用未解決
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 21年前
投稿: 600
 

> EOF の判定処理の部分で、
> std::fstream::failbit が立ってしまいます、
> このような場合の回避策、等があれば、

何を回避するんです?

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


返信引用
篝
 篝
(@篝)
ゲスト
結合: 15年前
投稿: 1
 

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


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 21年前
投稿: 600
 

↓これじゃダメ?

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
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

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

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


返信引用
眈
 眈
(@眈)
ゲスト
結合: 15年前
投稿: 3
 

επιστημη 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
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

直接、質問内容と関係なくて申し訳ないのですが、
ハンドルをコロコロ変えない方が良いと思います。
読んでいる方が混乱しますので。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 21年前
投稿: 600
 

> 読んでいる方が混乱しますので。

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


返信引用
眈
 眈
(@眈)
ゲスト
結合: 15年前
投稿: 3
 

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


返信引用
眈
 眈
(@眈)
ゲスト
結合: 15年前
投稿: 3
 

あら、おかしい篝 (みぞれ)と入力したのに?
また、眈になっている、すみません、もう一度だけテストします。


みぞれ



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


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

うーむ、うわさのGoogleの変換ソフトですかね?

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました