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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

10234閲覧

fopen()の"r+"と"w+"の挙動の違いについて教えてください。

jackhase

総合スコア22

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/04/30 12:50

phpのファイル読み込みの練習としてアクセスカウンタを作っていてその中での質問です。

php

1<?php 2$file_name = "count.txt"; 3$fh = fopen($file_name,"w+"); 4$count = fgets($fh, 10); 5rewind($fh); 6$count++ 7fwrite($fh,$count); 8fclose(); 9print "あなたは" . $count . "人目の訪問者です。"; 10?>

サンプルコードではfopen()のモードは"r+"になっているのですが、読み書きモードであれば他のモードでも同じではないかと思いw+、その他の+付きモードにしても動きませんでした。
リファレンスなどをググってみても動かない理由となる記述がどれなのかわかりませんでした。
読み込み専用、書き込み専用、読み書き専用の場面別の使い分けを教えていただけませんか?
ex.
r → ~したいとき。
r+ → ~したいとき

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

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

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

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

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

guest

回答3

0

ベストアンサー

オプション意味詳細
r読み込み専用読み込みのためにオープン。書き込み不可。ポインタはファイルの先頭
w書き込み専用書き込みのためにオープン。読み込み不可。ポインタはファイルの先頭。既存ファイルは切り詰められる
a追加専用書き込みのためにオープン。読み込み不可。ポインタはファイルの最後
r+読み書き両用読み書き両用。ポインタはファイルの先頭
w+読み書き両用読み書き両用。ポインタはファイルの先頭。既存ファイルは切り詰められる
a+読み追加両用読み込み+追加。ポインタはファイルの先頭。書き込みする場合は常にファイル末尾に追加される
  • を付けると読み・書きのもう一方の処理も可能になる、という機能を持っています。

ですので、w+ でオープンすると読み込みが可能になるのですが、初期状態では(当然ながらファイルが切り捨てられているので)w と違いがありません。

違いはファイル操作の途中にあります。
w+ であれば w と違い、ファイルシークして「一度書いたものを読み込む」ことができる、のです。

PHP

1<?php 2 3$fp = fopen('./fopen.txt', 'w+'); 4fwrite($fp, "ABCDE\n"); 5fflush($fp); 6fseek($fp, 0, SEEK_SET); 7echo fgetc($fp); 8fclose($fp); 9 10?>

この結果は 'A' が出力されます。

PHP

1<?php 2 3$fp = fopen('./fopen.txt', 'w'); 4fwrite($fp, "ABCDE\n"); 5fflush($fp); 6fseek($fp, 0, SEEK_SET); 7echo fgetc($fp); 8fclose($fp); 9 10?>

こちらだと何も表示されません。

投稿2019/05/01 02:51

編集2019/05/01 03:11
tacsheaven

総合スコア13703

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

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

0

既にコメントにリンクがありますが、fopen - PHP を見ると、

"r+" - 読み書きにオープン、ファイルポインタを先頭に
"w+" - 読み書きにオープン、ファイルポインタを先頭にし、ファイルサイズを ゼロに

ですね。C言語と同じ? あと、ファイルが無い時の挙動も注意です。("w+" は作成)

投稿2019/04/30 14:02

pepperleaf

総合スコア6383

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

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

jackhase

2019/04/30 14:32

サイズをゼロにするとはどういう意味ですか?
pepperleaf

2019/04/30 14:36

既にある内容を空にします。 (新規作成と同じ) "r+"でのオープンだと、以前のデータ(訪問者数)を読み込めますが、"w+" だと消してるので、無理ですね。 その違いでしょうか。
jackhase

2019/04/30 17:00

なるほどですね。理解しました。だとすればファイルサイズをゼロにするとはどのような用途で使用するのでしょうか。
pepperleaf

2019/05/01 01:03

上書きです。 Pythonには無いようなので、使われる事が少ないオプションかも知れません。
guest

0

7. 入力と出力

ここをよく読みましょう

r+ というのはありますが、w+ってのは書いてないですね

投稿2019/04/30 13:35

y_waiwai

総合スコア87747

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

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

pepperleaf

2019/04/30 14:03

PHP の質問みたいですが、
y_waiwai

2019/04/30 14:06

お、まじで勘違いしてました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問