• ベストアンサー

fopen()とFileOpen() どの様に違いますか?

Borland C++Builder5でテキストファイルを読み書きするようなプログラムを作っています。 テキストファイルを読み書きするのに、fopen()、fgets()というような関数を使っています。 しかし、FileOpen()関数などもあり、どちらを使うべきか分かっていません。 結果が同じならどちらでも良いのですが、Windows7が出たり、将来64ビットOSが主流になった時などに、今私が作ったプログラムが動かない、というようなことが起きると困ります。 私にプログラム言語を教えてくれた人が、ちょっと古い人で、昔の知識を引きずっているようなのです。 現状は何も問題は起きていないのですが、ちょっと心配なのです。

質問者が選んだベストアンサー

  • ベストアンサー
  • BLK314
  • ベストアンサー率55% (84/152)
回答No.4

>さて、std::fstremというのはよく分かりません。 std::fstreamの間違いです。 詳細は http://www.kab-studio.biz/Programing/Codian/iostream/04.html を参照してください。 簡単に言うと C++の標準ライブラリとして制定された ファイル入出力クラスです。 "<<", ">>"などによる入出力が行えます。 それから、誤解なさっているといけませんので 補足させてください。 私は、fopen等を完全否定しているわけではありません。 "Effective C++ 第2版"でも指摘されているように、 基本的には"stdio.h"は忘れてiostreamを使うべきだと思います。 しかし、効率などの点でやむを得ず<stdio.h>を使うべき場面が出てくる ことを否定するわけではありません。 基本はfstream, 限定的にstdio.hであって、 stdio.hをフルに採用して、fstreamを使わないというのは "違う気がする" と述べたのです。 >それから、一番聞きたかったことは、fopenやfgetsを使って作った実行ファイル>が、OSが新しくなることで動かなくなることがあるか、ということです。 これは、基本的には、ありえません。 32ビット環境と64ビット環境のようなまるっきり違う環境でもない限り 大丈夫です。 現時点では、C++標準化委員会はCとの互換性を最大限尊重しています。 (完全な互換性にはこだわっていませんが...) ですから、Cの標準関数がばっさり切られる可能性は殆どないのでは ないでしょうか?

CLMN
質問者

お礼

BLK314さん、ありがとうございました。 御礼が遅くなり申し訳ありませんでした。 >それから、誤解なさっているといけませんので 多分誤解していません。 C++コンパイラーを使うなら、C++関数を使った方がよい、ということは感じています。 もしかしたら、私のプログラミングは「飛行機でドライブしている」ようなものかも知れません。 つまり「空を飛ぶ」という機能があるのに、あえて「地上を走っている」状態なのかも。 目的地には、どちらでも到達できるのですが効率が違います。 もう少しC++を勉強しなくてはいけませんね。 納期のことを考えると、stdio.hを捨てるのは簡単には出来ません。 しかし、どこかで決心をしなくてはいけませんね。

その他の回答 (3)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

fopenやfgetsもC++の標準関数ですので、使ってはいけない理由はありません。 どちらかというと低水準な関数群ですので、効率を重視する場合にはこちらの方が向いています。 また、例外ハンドラやデストラクタなど、勝手に例外を送出して欲しくない文脈で使うときにも便利です。 要はケースバイケースで、適切に使い分けることが重要ですね。

CLMN
質問者

お礼

jactaさん、ありがとうございました。 なるほど、専門家の皆さんでも意見が分かれるのですね。 私はテキストファイル専門なのですが、順次呼び出しの他にも、fseekを使って、テキストファイルをランダム読みするプログラムも作ります。 こんな場合でもfopenやfgetsで狙いが果たせたので、他の関数を勉強しようという気にならないでいました。 でも、皆さんの話がよく分からない部分もあって、やはり勉強不足を痛感しました。 fopenやfgetsが完全否定されなかったので少し安心しましたけど・・・。

  • BLK314
  • ベストアンサー率55% (84/152)
回答No.2

C++でfopenは"違うのでは"と思っています。 fopen, fgetsはCの標準関数であり、C++の標準関数ではありません。 従って"例外を投げる"ことができません。 "自分でfopenの戻り値をチェックし、例外を投げるようにラッピングすればいいのでは?" 確かに、そのとおりです。 しかし、"車輪の再発明"という言葉もあります。 (実装がどうなっているかは別として) 同じ様な事をstd::fstreamを始め、MFCのCFileなど多くのライブラリがサポートしています。これらはC++専用ライブラリです。C++では当然こちらを採用すべきと考えます。 互換性という点なら std::fstremがお勧めです。 これらは"C++ 標準化委員会"できちっと審査され、規格になっています。 もちろん、規格自体、未来永劫、永久不変であることが保障されているわけではありませんが、専門家が集まって、多角的な検討を加えて議論しているものですので、1メーカーの営業戦略とかに左右されることはないと思われます。その意味では信頼して良いのではないでしょうか?

CLMN
質問者

お礼

ありがとうございました。 「車輪の再発明」という言葉は初めて聞きました。 Netで調べたらたくさん出て来て、有名な言葉だったんですね。 ちょっと耳の痛い話です。 さて、std::fstremというのはよく分かりません。 改めて参考書を開くと、 infile.open() infile.getline() などの記述がありましたが、このことでしょうか? 再度、勉強しなおす必要がありそうです。 それから、一番聞きたかったことは、fopenやfgetsを使って作った実行ファイルが、OSが新しくなることで動かなくなることがあるか、ということです。 もちろんそのOSが32ビットを保証しない、というものなら仕方がないのですが、同じコンパイラーで作ったプログラムで、fopenだと動かないが、別の関数を使って作ってあれば動く、というようなことがあるだろうか、という心配なのです。 この辺についてもアドバイスいただければ幸いです。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

将来性というか、互換性が気になるなら、迷わずfopenです。 あるいは、std::fstreamです。

関連するQ&A