重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

こんにちは。
よろしくお願いいたします。

次はソースの一部です。
ofstreamで定義した「OutFile」をオープンすると、aaa.tmp は作成されるのですが、オープンできずエラーメッセージを出力します。
何がおかしいのでしょうか?
どこが間違っているのでしょうか?

ofstream OutFile;
AnsiString asBuff;

asBuff = "C:\\aaa.tmp";
OutFile.open( asBuff.c_str() );
if( !OutFile ){
ShowMessage("エラー");
}

A 回答 (2件)

一応確認ですが, 「もともとそのファイルは存在しなかった」のですね?


ん~, なんだろ.... エラーの種類を知る方法ってなかったっけ....
ちなみに「NULL との比較」はしてませんよ>#1.
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

>一応確認ですが, 「もともとそのファイルは存在しなかった」のですね?

はい、そうです。ファイルは存在してなくて、ファイルをopenした時に作成されます。

環境はボーランドC++Builder6.0 で、
if( !OutFile ){ と言う書き方はBCB6.0のHELPにも記載されていたのですが、そもそも間違いなのですか?

お礼日時:2009/06/28 18:11

>オープンできずエラーメッセージを出力します。



>if( !OutFile ){
>ShowMessage("エラー");
>}

これ、明らかにおかしいでしょ。

ストリームオブジェクトをNULLかどうか比較しても、オープン出来たかどうかは判らない。

オープンに成功しても失敗しても「ストリームオブジェクトは何がしかの実体を持っていて、NULLになる事は有り得ない」から。

もしかして
FILE *ofp;
ofp = fopen("C:\\aaa.tmp","w");
if (!ofp) {
ShowMessage("エラー");
}
みたいに書けると勘違いしたかな?

こう書けるのは「fopenは失敗したらNULLを返す」からであって、ofstream::open()では、そうはいかない。

ofstream::open()は値を返さない。

その代わり、例外を送出してくるので、try...catch文で例外を捕まえ、例外処理に飛んできた時だけエラーだと判定すれば良い。

つまり「ofstream::open()のあとにif文があるのが変」って事。

なぜならopenの次の文に来るのは「オープンが成功した時だけ」だから。

逆にいうと「オープンに失敗した時は、openの次の文の所には来ない」ってこと。

なので、ShowMessageがある場所が変です。それを書く場所は「try...catch文のcatch節の所」だから。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

ボーランドC++Builder6.0 を使用していて、
if( !OutFile ){ と言う書き方はBCB6.0のHELPにも記載されていたのですが、そもそも間違いなのですか?
同様の書き方をしているサイトもいくつかあり、この事をどのように確認したらよいか悩んでします。

お礼日時:2009/06/28 18:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!