topic: file-io (read / write / CSV / paths / upload概念) / ch03
ch03 — ファイルに書く
学習目標
file_put_contents()で 文字列をファイルに書けるfopen('w')+fwrite+fcloseのパターンで書ける- 追記モード (
FILE_APPEND/fopen('a')) と上書きモードの違いを言える - 書き込み先は必ず
sys_get_temp_dir()配下 にして、後でunlinkで消す
所要時間
スライド = 5 分 / ドリル = 約 25 分
ドリル
| # | 内容 |
|---|---|
01-write-and-read/ |
一時ファイルに書いて読み返す (ラウンドトリップ) |
02-append/ |
FILE_APPEND で 2 回書いて、追記されていることを読み返しで確認 |
採点
php scripts/grade.php topics/14-file-io/ch03-write-file/drill/01-write-and-read/
php scripts/grade.php topics/14-file-io/ch03-write-file/drill/02-append/
確認のコツ
- 書き込み先は
tempnam(sys_get_temp_dir(), 'dojo_')で OS の一時領域に作る - 最後に
unlink($tmp)でクリーンアップ (CI が同じ drill を何度回しても汚れない) - リポジトリ内のファイル (
tests/data/...) には 書き込まない
演習問題の詳細
この章の演習問題の内容を読めます。実際に手元で解くには教材リポジトリを clone してください。
ドリル 01 — 一時ファイルに書いて読み返す
問題
OS の一時ディレクトリに一時ファイルを作って "Hello, File!\n" を書き込み、その中身を読み返して標準出力に出してください。最後にその一時ファイルを unlink で消してください。
期待される出力:
Hello, File!
採点
php scripts/grade.php topics/14-file-io/ch03-write-file/drill/01-write-and-read/
ヒント
$tmp = tempnam(sys_get_temp_dir(), 'dojo_io_');
file_put_contents($tmp, "Hello, File!\n");
echo file_get_contents($tmp);
unlink($tmp);tempnam($dir, $prefix):$dir配下に被らないファイル名を作り、空ファイルを置いてパスを返すsys_get_temp_dir(): OS の一時ディレクトリパス (Mac/Linux なら/tmp)unlink($path): ファイルを削除する
なぜ一時ディレクトリに書くのか
- リポジトリ内 (
__DIR__配下) に書くと、採点を回すたびにリポジトリが汚れる sys_get_temp_dir()配下 +unlinkで消す = 「実行後は何も残らない」 が L14 の作法
つまづいたら
Hello, File!の後に空行が 1 つ余計に出る →echo file_get_contents($tmp) . "\n";のように追加で改行を足していないかunlinkでWarningが出る →tempnamの戻り値 (フルパス) を渡しているか。nullや空文字を渡していないか
ドリル 02 — `FILE_APPEND` で追記する
問題
一時ファイルに以下の順で書き込み、最終的な中身を読み返して出力してください。最後に unlink で削除します。
"line1\n"を書く (上書き)"line2\n"をFILE_APPENDで追記"line3\n"をFILE_APPENDで追記- ファイル全体を読み返して
echo unlinkで消す
期待される出力:
line1
line2
line3
採点
php scripts/grade.php topics/14-file-io/ch03-write-file/drill/02-append/
ヒント
$tmp = tempnam(sys_get_temp_dir(), 'dojo_io_');
file_put_contents($tmp, "line1\n");
file_put_contents($tmp, "line2\n", FILE_APPEND);
file_put_contents($tmp, "line3\n", FILE_APPEND);
echo file_get_contents($tmp);
unlink($tmp);FILE_APPENDを渡さないと 上書き されて前の中身が消える- ログ書き込みでは
FILE_APPEND | LOCK_EX(排他ロック付き追記) が定番
つまづいたら
- 出力が
line3だけになる → 2 回目以降のfile_put_contentsにFILE_APPENDを渡し忘れている (= 上書き) line1line2line3のように改行が無い → 各文字列の末尾"\n"を書き忘れている ("line1"ではなく"line1\n")
演習問題(2問)
サイト内で問題文・雛形・解答例を確認できます。実際に手元で解くには教材リポジトリを clone してください。