- ベストアンサー
C++でfprintfやprintf,fopenなどを使うのは好ましくない?
今までCは多少慣れがあり、一方でC++はごく最近始めました。 CとC++でパッと見明らかに違うのが入出力の関数とストリームだと思うのですが どうも私的にはCで使いっていたfprintfなどが使いやすいと思ってしまいます。 実数の表示の小数点以下の桁の指定とか、fprintf("xxxx%.3f")としたほうが ラクチンではないでしょうか? ただEffective C++などを見た感じC++ではC++のやり方のほうが良い とか書いてあってやはりそういうもんなのかなぁと。 それなら多少C++の利便性を切り捨ててでもCでやるかなぁと 思ってしまうのですが。。。 アドバイスいただけたら幸いです。お願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
C++で printf() などを使うのは一概に悪いというわけではありません。 最低限、混在して使わなければ、まずはOKです。 ただ、ひとつ考えて欲しいのは、 > fprintf("xxxx%.3f") としたほうが楽 なのは、単に、これまでCで使い慣れていたからという理由に過ぎません。本質的にそちらの方が楽というわけではないのです。 一方で、printf() 系列の問題点というのは、可変引数関数なので、引数の型判定が実行時にしかわからないという点があります。 int i; printf("%f", i); などとして、表示がおかしいのに悩んだりするのはよくあることです。 また、決定的なこととして、C++では、クラスという「自前の型(ちょっと違う)」を作ることができます。これは、printf() では直接扱うことができません。 しかし、 class myClass; // 適切に << を定義する myClass aInstance; int i; cout << aInstance << " → " << i << "\n"; のように、C++流のストリームを使えば、それらも統一的に扱うことができます。 また、引数の型が異なっても適切に処理されます。 このようなことを含めて、C++のパワーを使うには、C++の流儀が良いということです。
その他の回答 (3)
- aid-u
- ベストアンサー率75% (22/29)
C++でのprintf()の使用ですが、型チェックの問題があることを認識したうえで使用することは問題ないと思います。 これは、printf()が実用上で有用な関数だと考えるためです。 型のチェックについては、コンパイラを含めたツールで対応できるのではないでしょうか。 gccではワーニングレベルの指定により、型が一致しない場合にワーニングを出せます。 printf()は、他の言語に取り入れられていることからも有用であることが推測できます。 以下はprintf()が取り入れられている言語の一部です。調べればもっと増えると思います。 ・Perl ・Ruby ・Java ・OCaml Javaは、J2SE 5.0になってから取り入れられています。 また、OCamlは型チェックが厳しい言語でprintf()の仕様とは相性が悪そうですが、 強引(と私は思う)な方法で、取り入れています。 これらのことは、言語を設計する方がprintf()を実用的な関数と判断したためだと思います。
- turukame2005
- ベストアンサー率24% (173/720)
批判の嵐を恐れずに、あえて書くと、、、 最近C++は、「落ち目」だとか、「斜陽」だとか言われます。 そう言われるには、それだけの複合的な要因があるのでしょうが、私は、「上位互換性」の問題は、大きいと思います。 C++でCのコードが使えます、VC++はC++のコードもCのコードも使えます、というのは、たいへんなメリットなのですが、現実に何が起きているかというと、「古いものが幅を利かせる」ということになってしまっています。 キャリアの長い、「教える立場」の人たちの中には、いつまでも古臭いコードに執着して、新しいものを頭ごなしに否定する、というようなこともあります。 たとえば、「MFCをいくらやっても本質がわからない」というのは、核心をついた指摘ですが、だからといってMFCそのものを否定してしまっては、進歩がありません。 その結果、マイクロソフトが、MSDNの中で「今後FMCのサポートをしない」なんてことを、大きな字で書くような事態になりました。 古いものに執着する人には都合がいいでしょうが、生産性を考えれば、今どきMFC抜きでC++の全てをまかなうことはできません。 C++やVC++が使われなくなってきている背景には、そうした混乱もあると思います。 その点、Javaなどは、バージョンが上がるたびに、「ご破算では」ということになりますから、みんな「横並び一線」です。 そんなことで、今後本格的にC++に取り組む、ということだったら、積極的に新しいものにチャレンジする姿勢のほうが、いいのではないでしょうか。
- jacta
- ベストアンサー率26% (845/3158)
場合場合での使い分けですね。 分かりやすい例でいうと、デストラクタ内や例外ハンドラ(catch節)でログを吐かせるような場合、(少なくとも私は)fprintfやfputsなどを使っています。そんなところで例外を送出するかもしれないC++のストリームは使いたくないからです(fprintfなどを使っても、no-fail保障まではできませんが、ログ出力ならそれでも済んでしまうので)。 > どうも私的にはCで使いっていたfprintfなどが使いやすいと思ってしまいます。 > 実数の表示の小数点以下の桁の指定とか、fprintf("xxxx%.3f")としたほうが > ラクチンではないでしょうか? これは間違いありません。 boost::formatを使うと幸せになれる可能性大ですので、調べてみることをお勧めします。
お礼
みなさん丁寧な解説ありがとうございました。 割合いろんな流儀があるのですね。 少し納得できました。ありがとうございました!