トップページ >  PHP >  fopenと@fopen
初版2012/05/14: 最終更新日2012/05/14
fopenと@fopen
目次
fopenと@fopen
fopenの使い方
ファイルを1行ずつ読み込む
fopenと@fopen
fopenではファイルをオープンして読み込んだり、ファイルを書き込みモードで新規作成したり出来ます。
例えば、読み込みモードでa.txtというファイルを指定した場合、そのファイルが存在しない場合、以下のようなエラーが表示されます。

PHP Warning:  fopen(a.txt): failed to open stream:
No such file or directory in /root/test1.php on line 3

このようなエラー出力を抑制したい場合に、@fopenを使用します。これはエラー出力を抑制するので、ファイルが存在しなくてもエラー出力はされません。
fopenの使い方
fopenの使い方は

fopen(ファイル名,モード);

とします。モードは書き込みモードなら、"w",読み込みモードなら"r"を指定します。
ファイル名は実際存在するファイルを指定します。書き込みモードの場合は新規作成なので作成したいファイル名を指定します。
以下サンプルです。

#!/usr/bin/php
<?php
$fl = fopen("a.txt","r");
$ln = fgets($fl);
fclose($fl);
print $ln."¥n";
?>

ファイルポインタは最後に必ずfcloseでクローズします。

ファイルを1行ずつ読み込む
ファイルを1行ずつ読み込むには、fgetsを使用します。
以下のサンプルでは、三行目が<DDD>の場合、<DDD>をそのまま表示するようにしています。
このとき、読み込んだ$bufferには改行コードが入っているため、

str_replace(array("¥r¥n","¥r","¥n"), "", $buffer);

で改行コードを削除しています。eucJP-winでは、ダブルクォーテーションでないと、改行コードが削除されませんでした。

<?php
  $fp = @fopen('sampledata.dat', 'r');

  if ($fp){
    $i = 1;
    while (!feof($fp)) {
      $buffer = fgets($fp);
      if($i == 3){
        if(strcmp(str_replace(array("¥r¥n","¥r","¥n"), "", $buffer),"<DDD>") == 0){
          print(str_ireplace('>','&gt;',str_ireplace('<','&lt;',$buffer)) . '
'); }else{ print(<br />'); } }else{ print($buffer . '<br />'); } $i++; } } fclose($fp); ?>

サンプルデータは以下のとおりです。

aaa
bbb
<DDD>
ccc
ddd
eee
fff
ggg
hhh
iii
jjj
kkk
11

実行結果は以下のとおりです。

aaa
bbb
<DDD>
ccc
ddd
eee
fff
ggg
hhh
iii
jjj
kkk
11