C言語関係掲示板

過去ログ

No.266.C++とfprintfについて

[戻る] [ホームページ]

No.1604

C++とfprintfについて
投稿者---Shigeru(2002/05/25 15:53:40)


C言語の掲示板で大変申し訳ないのですがC++の質問をさせてください。
C言語にはfprintfという関数がありますよね。(C++にもあるけど)
fprintfを使う際に
fprintf(stderr, "関数%sの%d行目でエラー発生!", MethodName, __LINE__);
なんて書き方ができると思いますが、C++では
cerr << "関数" << MethodName << "の" << __LINE__ << "でエラー発生!"
という風に書くしかないのですか? fprintfの書き方に比べると
かなり見づらいので、ほかに書き方があるのならば教えていただけませんか。よろしくお願いいたします。


No.1608

Re:C++とfprintfについて
投稿者---B.Smith(2002/05/27 15:51:33)


こんにちは。

>fprintf(stderr, "関数%sの%d行目でエラー発生!", MethodName, __LINE__);
>なんて書き方ができると思いますが、C++では
>cerr << "関数" << MethodName << "の" << __LINE__ << "でエラー発生!"
>という風に書くしかないのですか?

私は標準入出力クラスをほとんど使わないので、はっきりしたことは分かりませんが、恐らくメンバ関数としては備わっていないと思います。
ソースコードの見栄えではなく、完成品を第一の目標とするのであれば、CとC++の違いにあまりこだわらずに、printf系関数を使えば良いと思います。特にデバッグの処理ならば尚更です。

どうしても標準入出力クラスを使用したければ、一旦バッファ上で編集し、そのバッファの内容を出力する、という方法が考えられます。
例.
    char    Buf[100];

    sprintf(Buf,"関数%sの%d行目でエラー発生!", MethodName, __LINE__);
    cerr << Buf;

ここでは関数sprintfを使用して文字列編集を行っていますので、今回のケースに限って言えば、

>fprintf(stderr, "関数%sの%d行目でエラー発生!", MethodName, __LINE__);

この方が簡単ではあります。

この方法の利点は、I/Oが変わってもバッファの出力先(出力方法)を変更するだけで済む、ということです。例えば、このプログラムをWindowsアプリケーションに移植した場合、
    sprintf(Buf,"関数%sの%d行目でエラー発生!", MethodName, __LINE__);
    MessageBox(hWnd,Buf,"エラー情報",MB_OK | MB_ICONEXCLAMATION);  /* cout << Buf; */

このように出力先を変更するだけで目的を達成出来ます。
エラー処理に限らず、例えばプリンタやファイルにもまったく同じ文言を出力したい、という場合に有効です。



No.1609

Re:C++とfprintfについて
投稿者---Kaji(2002/05/27 18:28:03)


こんにちわ。

こういうのはどうでしょうか?


void Error(char * format, ...)
{
char szBuff[2048];
va_list argptr;

va_start(argptr, format);
vsprintf(szBuff, format, argptr);
va_end(argptr);

cerr << szBuff;
}

使い方はprintf等と同じです。
出力先を自由に変更できるので便利だと思います。


No.1610

Re:C++とfprintfについて
投稿者---Shigeru(2002/05/27 20:09:21)


B.Smithさん、Kajiさん、アドバイスありがとうございます。
標準では用意されていないのですね。やっぱりfprintfを使うか
自分でる作るしかないのか・・・。
自分はてっきり
cout.fprintf("%s", 〜)
ってのがあるのだと思ってました(笑)