PHPのfopen関数について質問です

このQ&Aのポイント
  • PHPのfopen関数について質問です。Windowsベースのシステムでは\r\nを使用し、マッキントッシュベースのシステムでは\rを使用します。間違った改行コードでファイルに書き込むと、他のアプリケーション上でそのファイルを開いた際に変な風に見えてしまいます。Windows上では、\nを\r\nに透過的に変換するtext-mode変換フラグ('t')が提供されます。それに対し、'b'を使って強制的にバイナリモードにすることもできます。その場合データの変換はされません。このフラグを使用するには、'b'または't'をmode引数の最後に追加してください。
  • PHPのfopen関数の第二引数のモードにはバイナリモードがあります。これは、Windows系プラットフォーム上で改行コードを\r\nに変換する処理を行わずにファイルに書き込むことができるモードです。通常、Windowsでは改行コードとして\r\nが使用されますが、他のシステムでは\nなどが使用される場合があります。バイナリモードでは、改行コードの自動変換を行わずに指定された改行コードのままファイルに書き込まれます。
  • 例えば、あるバイナリファイルに奇跡的に\nというバイトがなかった場合、fopen("test.jpg","rw");でも問題ありません。バイナリモードを指定しない場合、改行コードの変換が行われるため、何らかの影響が生じる可能性があります。バイナリモードを指定することで、改行コードの変換を回避することができます。
回答を見る
  • ベストアンサー

PHPのfopen関数について質問です。

PHPマニュアル http://www.php.net/manual/ja/function.fopen.php 上記ページの >> Windows ベースのシステムでは \r\n を使用します。 マッキントッシュベースのシステムでは \r を使用します。 間違った改行コードでファイルに書き込むと、 他のアプリケーション上でそのファイルを開いた際に変な風に見えてしまいます。 Windows上では、\nを\r\nに透過的に変換する text-mode変換フラグ('t')が提供されます。 それに対し、'b'を使って強制的にバイナリモードにすることもできます。 その場合データの変換はされません。 このフラグを使用するには、'b' または 't'を mode引数の最後に追加してください。 とある様にPHPにおいてfopen関数の第二引数のモードに付加する場合のバイナリモードとは windows系プラットフォームにおいて書き込む文字列内に[¥n]というバイトがあった場合、プラットフォームにあわせて 自動的に書き出す際に¥r¥nに変換されるから・・・・。 という意味ですよね。 例えば、あるバイナリファイルに奇跡的に[¥n]というバイトがなかった場合、fopen("test.jpg","rw");でもよいということですよね?

  • PHP
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
noname#244856
noname#244856
回答No.1

fgets/fwriteなどの全てのストリームの読み書き操作に、こんな関数が適用されると思ってください。str_replace関数だと複数置換時にすでに置換した部分の上書きが起こるので、長さ順にソートして上書き置換を起こさないように自動でうまく調整してくれるstrtr関数を内部的に用います。 /* 改行コードを全てPHP_EOLで使われているものに統一する関数 */ function filter($str) { return strtr($str, array_fill_keys(array("\r\n", "\r", "\n"), PHP_EOL)); } まぁ私は互換性の面から、テキストファイルであってもバイナリファイルであっても全て「b」を使うようにしてますが…Windowsであってもメモ帳以外のエディタであればCRLFでなくてLF単独で正しく扱えますし… 備考↓ [PHP] ファイルオープンモードに関するマニュアルの記述は間違っている http://qiita.com/mpyw/items/3adcec3c66e515895b08

1000vicki
質問者

お礼

>Windowsであってもメモ帳以外のエディタであればCRLFでなくてLF単独で正しく扱えますし… ですよねー。

関連するQ&A

  • PHPのfopenのバイナリモードについて

    PHPのfopen時のバイナリモードについて質問です。 PHPのマニュアルにはWINDOWSのようなバイナリとテキストモードの形式の違う システムでは、画像等のバイナリファイルを扱うときはbを付けてバイナリモードで扱うことが推奨されていますが、 WINDOWS環境でためしたところ、画像ファイルをバイナリではなくテキストモードで開いて中身のデータを読み込んで、別名でfopen("~.jpg","w")で書き込んでも、きちんと表示される画像が作成されました。 テキストモードでバイナリファイルを開いても読み込めってさらに、新規でかきこめるなら なぜ二つのモードが存在するのでしょうか? ちなみに、WINDOWSにおけるバイナリとテキストモードの違いって改行文字が ¥nか¥r¥nの違いだけでしょうか? リナックスではバイナリもテキストも中身の改行文字は¥nとなるのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • windows環境でphpのfopenが使用できない

    rimyと申します。 windowsでapacheを使用していて、PHP5をインストールしています。 PHPは作動していて、スプリクトは実行できます。 しかしfopen関数を使ってファイルをロードしようとしたところ なぜかエラーが起きます。 fopen関数は fopen('ファイルパス','モード'); でやれるので やってみましたが、 Warning: fpassthru(): supplied argument is not a valid stream resource in C:\Apache\htdocs\test\reading.php on line 6 という表示が出ます。 ちなみにスプリクトは <html> <head><title>ファイルの読み出し</title></head> <body> <?php $text = fopen("test.txt","b""r"); fpassthru($text); ?> </body> </html> と書いてあります。 あるサイトで windows環境では モードにbを入れろ と書いてありましたがどういうことでしょうか。 まだ最近 勉強し初めでわかりませんのでよろしくお願いします。

    • ベストアンサー
    • PHP
  • C言語のfopenについて教えてください。

    C言語のfopenについて教えてください。 ある1つのファイルをr(テキストファイル読み込みモード)でfopenしたとします。 そのファイルをfcloseする前に、同じファイルが再度rモードでfopenされても問題ないのでしょうか? 何を気にしているかと言いますと、あるプログラムであるファイルをrモードでfopenして読み込む処理があるのですが、そのプログラムを呼び出す処理が複数あります。 確率は低いと言えど、もし同時にその処理が実行された場合、rモードでfopenしているファイルにfclose前に再度rモードのfopenがされたらエラーとなってしまうのでしょうか? もし、エラーとなる場合、回避する方法がありますか? また、エラーとならない場合は、fcloseするまで次の処理が待ってしまうのでしょうか? 読み込みモードだから問題ないのかなとも思ったのですが、どなたかご存知だったら教えてください。 よろしくお願いしますm(_ _)m

  • fopen()関数

    こんにちは。 PHPで、fopen()関数を使用し、別ファイルにでーたを保存しているのですが、 fopen ("ファイル名", "a"); とやると、ファイルに追記されますよね。 この追記を、ファイルの一番最初に行いたいのです。 一番最初に書き込みをできるということで、 fopen ("ファイル名", "r+"); なども試してみたのですが、 その追記された文字数だけ最初側の文字が消えてしまい、追記は無理でした。 rewind()関数も使用したのですが、ダメでした。 何方か、ファイルの最初に、既に書き込まれている文字を消さずに追記する方法をご教授くだされば幸いです。

    • ベストアンサー
    • PHP
  • fopenが動作しない

    PHPで、別のファイルで取得したファイル名をもとに fopenを使ってファイルを開こうとしているのですが、 どうしてもうまくいきません。 具体的な症状は以下のとおりです。 a.phpの中で、 … $file[2] = "hoge02.xml"; … のように、配列にファイル名を代入します。 これを b.php で require_once('a.php'); とした後 print_r($file); とすると Array([0] => … [2] => "hoge02.xml" [3]…) のように表示されるところまでは確認できました。 しかし、 $file0 = $file[2]; $fp = fopen("$file0", 'r'); とすると Warning: fopen( "hoge02.xml" ) [function.fopen]: failed to open stream: Invalid argument in [b.php の絶対アドレス] とエラーが出てしまい、実行することが出来ません。 そこで、 //$file0 = $file[2]; $file0 = "hoge02.xml"; $fp = fopen("$file0",'r'); とすると実行することが出来ました。 作成しているシステム上、fopenの1つ目の引数には変数または配列を使いたいのですが、 エラーが発生してどうしてもうまくいきません。 自分なりにも似たようなエラーがないか調べたのですが、 それらしいものを見つけることが出来ず、お手上げ状態です。 どなたか解決策をご存じないでしょうか。 ご教授の程、よろしくお願い致します。

    • 締切済み
    • PHP
  • C言語のfopen関数とfseek関数についてお尋ねします。

    fopen関数について オープンモードは様々ありますが、既存のファイルをバイナリモードで書き換えるということは出来ないのでしょうか? オープンモードが、「wb」などの場合は既存のデータを上書きしてしまって、内容が消えてしまいます。 かと言って、「ab」で開くと最後から追加されてしまいます。 fseek関数を使って、場所を指定しても言うことを聞いてくれませんでした。 既存のファイルの途中部分を少し書き換えるだけの作業は、出来ないのでしょうか? fseek関数について バイナリモードで開いているときに、ファイルの全体を知りたい時に次のように書いたら間違いなのでしょうか? fseek(FILE *stream, 0, SEEK_END); ftell(FILE *stream); fseekで最後のポジションに移動させて、ftellで最後のカレントポジションを調べるという方法は使えるのでしょうか? 以上2点よろしくお願いします。

  • fopenのmode「w」について

    宜しくお願い致します。 fopenのmode「w」で、ファイルを新規作成しつつ、データを書込みたい場合で、サーバ間でファイルを作成したい場合、http://~では、mode「w」でのファイル作成は出来ないですが、ftp://でのファイル作成は出来るとマニュアルに書いてあるのですが、failed to open streamエラーが発生してファイルが作れません。 PHP.iniで、open_basedirの指定はされておらず、allow_url_fopenはOnになっているのですが・・・。 何卒、ご教授の程、宜しくお願い致します。

    • 締切済み
    • PHP
  • c言語 fopen

    fopenについて質問があります。 fopenでファイルを開くとき、  fopen("http://~~~.php?A=1","r")  のようにURLを指定できるのでしょうか。

  • phpのマニュアルの質問です。

    phpのマニュアルの見方がいまいち分かりません。 http://www.php.net/manual/ja/function.fopen.php resource fopen ( string $filename , string $mode [, bool $use_include_path = false [, resource $context ]] ) 上記の例ですと、 ◎「string」「bool」これはどういう意味でしょうか?続くのが必ず変数なのはなぜでしょうか? ◎関数の中の引数の[ ]大カッコは何を意味してるでしょうか? 初歩的な質問ですが教えてください。

    • ベストアンサー
    • PHP
  • fopenのモードによりfgetsするレングスが異なるのは何故ですか?

    ファイルを読み、そのレングスをチェックしています。 $file = @fopen($_FILES['fl']['tmp_name'],"r"); if ($file) {  while (!feof($file)) {   $rec = fgets($file);   print("レングス".strlen($rec)."<br>");   (後略) 例えば1500バイトの固定長ファイルを読んだ場合、 fopenモード"r"だと以下の通りです。  レングス1502(改行が含まれるので1500+2?)  レングス1502 これをモード"r+"にすると以下のようになります。    レングス1502  レングス1499 両者の差はどこから来ているのでしょうか? ご教示いただけると幸いです。

    • 締切済み
    • PHP

専門家に質問してみよう