質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

2回答

9658閲覧

std::ofs.close()について

退会済みユーザー

退会済みユーザー

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/03/05 14:21

編集2019/03/06 08:35

ofsでファイルを開くのはいいのですが、ofs.closeを使わなくてもファイル入出力できます。やらなかった場合どんな影響が出てしまうのでしょうか。知っている方いましたら、知らないので教えてほしいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yohhoy

2019/03/05 14:43

ofs == std::ofstream ?
退会済みユーザー

退会済みユーザー

2019/03/06 08:35

yes
guest

回答2

0

やらなかった場合どんな影響が出てしまうのでしょうか。

実効上の影響はさほどありません。std::fstreamファミリ(ifstream, ofstream)では、該当変数のスコープが切れる際に 自動的にファイルクローズ処理が呼び出され ます。

c++

1{ 2 std::ofstream ofs("output.dat"); 3 4 ofs << /*...*/; 5 6} // 変数ofsのスコープ終了=自動的にcloseが呼び出される

逆の表現では、変数のスコープよりも早くファイルクローズを行いたい特殊なケースでのみ、明示的に close メンバ関数を呼び出す必要があります。


ofs.closeを使わなくてもファイル入出力できます。

close メンバ関数の目的は、「OSのファイル管理用リソース」と「C++ファイルストリームオブジェクト(std::ofstreamなど)」の関連付けを切断しリソースを解放することです。実ファイルに対する入出力(読み/書き)とは直接的には無関係です。

一方で、C++ファイルストリームオブジェクトでは「バッファリング機構」を備えるため、std::ofstreamによるファイル書出処理ではファイルクローズが行われるまで実ファイルが更新されないケースもあります。この場合でもストリームに対するフラッシュ(flush)操作を行うことで、そこまでの書出データを実ファイルへと反映できます。これはログファイル出力などでよく用いられる手法です。

c++

1std::ofstream logfile("application.log"); 2 3// ログファイルへ1行出力し、かつフラッシュ操作を行う 4logfile << "invoke something" << std::endl; 5... 6// 万一プログラムがここで異常終了してしまっても、 7// 直近までのログ内容がファイルに書き出されている。

投稿2019/03/07 11:55

yohhoy

総合スコア6191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yohhoy

2019/03/07 12:04 編集

cateye さん回答にもある通り、一般的なOSでは「同時に開けるファイル数」に上限値があります。その意味では早期のclose明示がまったくの無意味とは思いませんが、このようなケースでは変数スコープ範囲そのものを見直すべきです。 変数スコープとリソース管理を紐づける設計方法は、C++では RAII(Resource Acquisition Is Initialization) https://ja.wikipedia.org/wiki/RAII と呼ばれ、多くのケースで好ましいデザインとされます。
退会済みユーザー

退会済みユーザー

2019/03/10 17:30

わかりやすく書いてくださってありがとうございます。 疑問が晴れました。提示してくださったサイトありがたく拝見させていただきます
guest

0

オープンするファイル数には限度(OSごとに違う)があります。また、開けっ放しだとシステムリソース(メモリとか)が消費されます。まぁ、プログラムが終了すれば通常は開放されますが・・・
で、

ofs.closeを使わなくてもファイル入出力できます。

というのは何でしょう?close前ならオープンモードによった操作は出来て当たり前ですが?
closeすればそのファイルは閉じられ読み書きできなくなります。close後のファイルへの読み書きは絶対にしないでください(何が起こっても知りませんw)
「追記」
メモリの取得(malloc()とかnewとか)やファイルの後始末は、プログラマの責任です。“システム(OS)がやってくれるからいい”と言うのは怠慢です。気をつけましょう。

「追記」うちのOS(linux mint 191)での限界

text

1usr ~ % limit 2cputime unlimited 3filesize unlimited 4datasize unlimited 5stacksize 8192 kbytes 6coredumpsize 0 kbytes 7memoryuse unlimited 8vmemoryuse unlimited 9descriptors 1024 ←プロセスに許可されるオープン・ファイル記述子の最大数 10memorylocked 16384 kbytes 11maxproc 63648 12maxlocks unlimited 13maxsignal 63648 14maxmessage 819200 15maxnice 0 16maxrtprio 0 17maxrttime unlimited 18

投稿2019/03/05 20:50

編集2019/03/07 00:39
cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/03/06 08:34

確かにclose後に書き込もうとするのは危険なにおいがしますね。いつも開いたらひらっきぱにしているんですが、何も問題が起きないので閉じる必要性についてとても気になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問