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

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

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

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

Q&A

解決済

2回答

1433閲覧

PHPのファイル書き込みについて

asatteshiasatte

総合スコア11

PHP

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

0グッド

0クリップ

投稿2016/12/08 04:56

現在PHPを扱っています。

ファイル書き込みについての質問です。
fwrite等でファイル内の特定の位置に、空行を追加する事はできるのでしょうか。

例)
sample.txt

a a a

3行だけ書かれているsample.txtファイルを以下のように

a a //空行 //空行 a

3、4行目に空行を加えた5行のファイル内容に変更したいと思っています。

何かアドバイスがあれば、よろしくお願い致します。

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

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

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

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

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

guest

回答2

0

全部よみとって整形したうえで、先頭にシークした上で上書きすればいいのでは?

投稿2016/12/08 05:26

yambejp

総合スコア114843

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

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

0

ベストアンサー

いろんなやり方があるとは思いますが、テキストファイル操作なので行を挿入するというより以下のような処理になります。

###方法1

  • 対象のテキストファイルを全て読み込み
  • 「挿入する位置までの行」を出力
  • 「挿入する行」を出力
  • 「挿入する位置以降の行」を出力

PHP

1<?php 2ini_set( 'display_errors', 1 ); 3ini_set( 'error_reporting', E_ALL ); 4$lines = file('sample.txt'); 5$fp=fopen("sample.txt","w"); 6foreach ($lines as $line_num => $line) { 7 if ($line_num == 2) { 8 fputs($fp, PHP_EOL); 9 fputs($fp, PHP_EOL); 10 } 11 fputs($fp, $line); 12} 13fclose($fp);

結果

PHP

1$ cat sample.txt 2a 3a 4a 5$ od -tx1 sample.txt 60000000 61 0a 61 0a 61 0a 70000006 8$ php ins2line.php 9$ cat sample.txt 10a 11a 12 13 14a 15$ od -tx1 sample.txt 160000000 61 0a 61 0a 0a 0a 61 0a 170000010 18$

###方法2

  • 対象のテキストファイルを全て読み込み
  • 読み込んだものを文字列整形
  • 文字列成形したものを出力

PHP

1<?php 2ini_set( 'display_errors', 1 ); 3ini_set( 'error_reporting', E_ALL ); 4$data = file_get_contents('sample.txt'); 5$out = preg_replace("/^(.*\n.*\n)(.*)/", '${1}' . "\n\n" . '${2}', $data); 6$data = file_put_contents('sample.txt', $out);

###方法3
0. 対象のテキストファイルを全て読み込み(行ごとのarrayに読み込む)
0. 読み込んだarrayの3番目の要素の前に改行を2つの要素として挿入
0. 2の結果を出力

PHP

1<?php 2$filepath = 書き込むファイルの絶対パス 3$ret_array = file($filepath); 4$ret_array = array_splice($ret_array,2,0, array("\n", "\n")); 5file_put_contents($filepath, $ret_array);

投稿2016/12/08 05:19

編集2016/12/09 14:35
Y.H.

総合スコア7914

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

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

asatteshiasatte

2016/12/09 05:55

方法1を試してみたのですが、fputsでの書き込みが反映されませんでした。 エラーなどは出ていないのでfopen等には問題がないと思うのですが・・・。
Y.H.

2016/12/09 06:39

こちらで動作させた結果を回答に追加しました。 また、エラー出力の設定をコードに追加しました。PHPのコードの先頭に以下のように2行ini_set()を追加してみてください。 <?php ini_set( 'display_errors', 1 ); ini_set( 'error_reporting', E_ALL );
asatteshiasatte

2016/12/09 14:15

丁寧なアドバイスを頂きまして、ありがとうございます。 エラー出力がされないので、恐らく自分の方のfputsがスルーされて動作しておらず、ファイルに書き込めていないのが原因だと思います。 今までは $filepath = 書き込むファイルの絶対パス $ret_array = file($filepath); $ret_array[3] = 'aaa'; file_put_contents($filepath, $ret_array); このような流れでファイル書き込みを行っていて、これでは正常に行えていました。 file_put_contentsとfputsを同時に使っていたら不具合が起こるなどはあるのでしょうか。 繰り返し質問をしてしまい、申し訳ありません。
Y.H.

2016/12/09 14:27

回答に方法3を追加しました。 上記コメント記載のコードであれば方法3に記載したコードが一番わかりやすいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問