Borland C++Builder5でテキストファイルを読み書きするようなプログラムを作っています。
テキストファイルを読み書きするのに、fopen()、fgets()というような関数を使っています。
しかし、FileOpen()関数などもあり、どちらを使うべきか分かっていません。
結果が同じならどちらでも良いのですが、Windows7が出たり、将来64ビットOSが主流になった時などに、今私が作ったプログラムが動かない、というようなことが起きると困ります。
私にプログラム言語を教えてくれた人が、ちょっと古い人で、昔の知識を引きずっているようなのです。
現状は何も問題は起きていないのですが、ちょっと心配なのです。
No.2
- 回答日時:
C++でfopenは"違うのでは"と思っています。
fopen, fgetsはCの標準関数であり、C++の標準関数ではありません。
従って"例外を投げる"ことができません。
"自分でfopenの戻り値をチェックし、例外を投げるようにラッピングすればいいのでは?"
確かに、そのとおりです。
しかし、"車輪の再発明"という言葉もあります。
(実装がどうなっているかは別として)
同じ様な事をstd::fstreamを始め、MFCのCFileなど多くのライブラリがサポートしています。これらはC++専用ライブラリです。C++では当然こちらを採用すべきと考えます。
互換性という点なら
std::fstremがお勧めです。
これらは"C++ 標準化委員会"できちっと審査され、規格になっています。
もちろん、規格自体、未来永劫、永久不変であることが保障されているわけではありませんが、専門家が集まって、多角的な検討を加えて議論しているものですので、1メーカーの営業戦略とかに左右されることはないと思われます。その意味では信頼して良いのではないでしょうか?
ありがとうございました。
「車輪の再発明」という言葉は初めて聞きました。
Netで調べたらたくさん出て来て、有名な言葉だったんですね。
ちょっと耳の痛い話です。
さて、std::fstremというのはよく分かりません。
改めて参考書を開くと、
infile.open()
infile.getline()
などの記述がありましたが、このことでしょうか?
再度、勉強しなおす必要がありそうです。
それから、一番聞きたかったことは、fopenやfgetsを使って作った実行ファイルが、OSが新しくなることで動かなくなることがあるか、ということです。
もちろんそのOSが32ビットを保証しない、というものなら仕方がないのですが、同じコンパイラーで作ったプログラムで、fopenだと動かないが、別の関数を使って作ってあれば動く、というようなことがあるだろうか、という心配なのです。
この辺についてもアドバイスいただければ幸いです。
No.3
- 回答日時:
fopenやfgetsもC++の標準関数ですので、使ってはいけない理由はありません。
どちらかというと低水準な関数群ですので、効率を重視する場合にはこちらの方が向いています。
また、例外ハンドラやデストラクタなど、勝手に例外を送出して欲しくない文脈で使うときにも便利です。
要はケースバイケースで、適切に使い分けることが重要ですね。
jactaさん、ありがとうございました。
なるほど、専門家の皆さんでも意見が分かれるのですね。
私はテキストファイル専門なのですが、順次呼び出しの他にも、fseekを使って、テキストファイルをランダム読みするプログラムも作ります。
こんな場合でもfopenやfgetsで狙いが果たせたので、他の関数を勉強しようという気にならないでいました。
でも、皆さんの話がよく分からない部分もあって、やはり勉強不足を痛感しました。
fopenやfgetsが完全否定されなかったので少し安心しましたけど・・・。
No.4ベストアンサー
- 回答日時:
>さて、std::fstremというのはよく分かりません。
std::fstreamの間違いです。
詳細は
http://www.kab-studio.biz/Programing/Codian/iost …
を参照してください。
簡単に言うと
C++の標準ライブラリとして制定された
ファイル入出力クラスです。
"<<", ">>"などによる入出力が行えます。
それから、誤解なさっているといけませんので
補足させてください。
私は、fopen等を完全否定しているわけではありません。
"Effective C++ 第2版"でも指摘されているように、
基本的には"stdio.h"は忘れてiostreamを使うべきだと思います。
しかし、効率などの点でやむを得ず<stdio.h>を使うべき場面が出てくる
ことを否定するわけではありません。
基本はfstream, 限定的にstdio.hであって、
stdio.hをフルに採用して、fstreamを使わないというのは
"違う気がする"
と述べたのです。
>それから、一番聞きたかったことは、fopenやfgetsを使って作った実行ファイル>が、OSが新しくなることで動かなくなることがあるか、ということです。
これは、基本的には、ありえません。
32ビット環境と64ビット環境のようなまるっきり違う環境でもない限り
大丈夫です。
現時点では、C++標準化委員会はCとの互換性を最大限尊重しています。
(完全な互換性にはこだわっていませんが...)
ですから、Cの標準関数がばっさり切られる可能性は殆どないのでは
ないでしょうか?
BLK314さん、ありがとうございました。
御礼が遅くなり申し訳ありませんでした。
>それから、誤解なさっているといけませんので
多分誤解していません。
C++コンパイラーを使うなら、C++関数を使った方がよい、ということは感じています。
もしかしたら、私のプログラミングは「飛行機でドライブしている」ようなものかも知れません。
つまり「空を飛ぶ」という機能があるのに、あえて「地上を走っている」状態なのかも。
目的地には、どちらでも到達できるのですが効率が違います。
もう少しC++を勉強しなくてはいけませんね。
納期のことを考えると、stdio.hを捨てるのは簡単には出来ません。
しかし、どこかで決心をしなくてはいけませんね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
- C言語・C++・C# C言語 3 2022/10/04 15:07
- 仕事術・業務効率化 効率的な勉強方法(分野問わず)を教えてください 1 2023/08/16 01:33
- UNIX・Linux VirtualBox ゲストOSにPC内蔵HDDのパーティションをマウントする方法は? 2 2023/05/06 22:52
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、写真のプログラムをどう直せ 2 2022/07/09 21:13
- C言語・C++・C# c言語 コマンドライン引数 4 2023/02/09 18:47
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- C言語・C++・C# C言語で 英文字のみからなる文字列、”Radar”、”WasItACatISaw”、”a”、””(空 5 2022/12/20 15:17
- C言語・C++・C# c言語 1 2022/11/09 13:05
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Google ColaboでGUI作成
-
Windows Media Playerを開くと...
-
Ps+のフリープレイでDestiny2の...
-
scipy っていうのをいれようと...
-
python urlopen error について...
-
DirectX Graphics と OpenGLっ...
-
本格的なGUIを作るのにおすすめ...
-
マイコンSHでSQRT(平方根)が...
-
iCloudフォトライブラリ内の画...
-
Windows上でJavaかc言語を使い...
-
WAVE⇔MP3のためのライブラリ
-
LIBCMT.LIBをリンクしてコンパ...
-
動画像をキャプチャするプログラム
-
Dreamweaverのライブラリが反映...
-
c言語でntpdateコマンドにあた...
-
マイミュージックの曲で、WMPの...
-
Excel2003 VBE 参照設定を解除...
-
ituneを複数のPCにインストール...
-
ListViewで複数項目のドラッグ...
-
プログラマーで「使えない人」...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Ps+のフリープレイでDestiny2の...
-
Windows Media Playerを開くと...
-
本格的なGUIを作るのにおすすめ...
-
python urlopen error について...
-
Google ColaboでGUI作成
-
scipy っていうのをいれようと...
-
システムコールと標準ライブラ...
-
ライブラリ作成時のグローバル...
-
強化学習の環境作成、AI。自動...
-
プログラマーで「使えない人」...
-
unix-c と linux-c の違いは?
-
C++ 標準ライブラリの実際の中...
-
マウスのクリックを自動で
-
C# EXCELセルの入力規則設定に...
-
LIBCMT.LIBをリンクしてコンパ...
-
gcc に mktemp 危険と怒られ...
-
Dreamweaverのライブラリが反映...
-
静的ライブラリから静的ライブ...
-
DLL読み込み時エラー
-
sleep関数
おすすめ情報