2

学校の課題のために、PHP でスクリプトを作成する必要があります。名前付きの配列を作成し、その配列をファイルに書き込む必要があります。次に、配列を削除し、ファイル内の名前を読み取り、それらをエコーする必要があります。

これは機能しません:

<?php
    $names = array("Name 1", "Name 2", "Name 3", "Name 4", "Name 5");
    $filename = "names.txt";
    $handle = fopen($filename, "wb+"); //open as read and write
    $string = implode("\r\n", $names); //name on each line
    fwrite($handle, $string); //write line

    $names = array(); //empty array
    print_r($names); //print empty array
    $string = fread($handle, filesize($filename)); //read file
    $names = explode("\r\n", $string); //lines to array
    foreach ($names as $name) {
        echo("<br>\n$name");
    }
    fclose($handle);
?>

しかし、これは機能します:

<?php
    $names = array("Name 1", "Name 2", "Name 3", "Name 4", "Name 5");
    $filename = "names.txt";
    $handle = fopen($filename, "wb"); //open as write
    $string = implode("\r\n", $names); //name on each line
    fwrite($handle, $string); //write line
    fclose($handle); //close

    $handle = fopen($filename, "r"); //open as read
    $names = array(); //empty array
    print_r($names); //print empty array
    $string = fread($handle, filesize($filename)); //read file
    $names = explode("\r\n", $string); //lines to array
    foreach ($names as $name) {
        echo("<br>\n$name");
    }
    fclose($handle);
?>

ファイルを閉じて再度開くと、なぜ機能するのかわかりません。どんな助けでも大歓迎です。

4

2 に答える 2

8

必要なのはファイル ポインタを再起動することだけですfwrite()

fwrite()ハンドルが指すファイルストリームに string の内容を書き込みます。

  • length バイトが読み取られました
  • EOF (ファイルの終わり) に達しました
  • パケットが使用可能になるか、ソケット タイムアウトが発生する (ネットワーク ストリームの場合)
  • ストリームがバッファリングされて読み取られ、プレーン ファイルを表していない場合、チャンク サイズ (通常は 8192) に等しいバイト数までの最大 1 回の読み取りが行われます。以前にバッファリングされたデータによっては、返されるデータのサイズがチャンク サイズよりも大きくなる場合があります。

あなたが見ればfread()

fread()ハンドルが参照するファイル ポインタから最大 length バイトを読み取ります。次の条件のいずれかが満たされると、読み取りはすぐに停止します。

したがって、呼び出した時点でfread($handle, filesize($filename));すでにファイルの最後にいるため、何も表示されません。

これを解決するfseekには、ポインターをファイルの先頭に戻すだけです。

例 :

 fseek($handle, 0);

ファイルを閉じる必要はありません..最初のコードは完全に機能します

編集

PHP DOC から巻き戻すこともできます

ハンドルのファイル位置インジケータをファイル ストリームの先頭に設定します。

 rewind($handle);
于 2012-12-04T14:49:50.520 に答える
-2

2番目のスクリプトは正しいです。その理由は、書き込み用にファイルを開くと、読み取りには使用できないため、ファイルを閉じて、読み取り時に再度開く必要があるためです。

于 2012-12-04T14:48:59.840 に答える