Fopen получил некоторые странные поведения - PullRequest
2 голосов
/ 11 марта 2011

У меня есть файл с именем denem.txt, и он имеет содержимое

123456789
123456789
123456789

Когда мы открываем файл в режиме 'a + b', PHP должен поместить указатель в конец файла, что означает, что когда япопытаться получить символ с помощью функции fgetc, он должен вернуть False, поскольку feof имеет значение true.Однако, когда я использую код вроде

while (false !== ($char = fgetc($file))) {
    echo "$char\n";
}

, я получаю 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9.-> Это странно, потому что я не использовал rewind (), а указатель должен находиться в конце файла, значит, fgetc должен возвращать False.ftell возвращает int 0 означает, что указатель находится в начале файла.Однако, когда я пытаюсь записать что-то в файл с помощью fwrite, который использует текущую позицию указателя, он должен записать это в начало файла, если ftell нам не врет.Но когда я использую fwrite, угадайте, что произойдет, он записывает его в конец файла, и мой файл становится

123456789
123456789
123456789Test

У вас есть идеи по этому поводу?

Ответы [ 2 ]

3 голосов
/ 11 марта 2011

Вам нужно понять режим a+.

Открывает файл для чтения и добавления (запись в конце файла). Файл создается, если он не существует. Начальная позиция файла для чтения находится в начале файла, но вывод всегда добавляется к концу файла.

Существует только один указатель, который изначально находится в начале файла, но при попытке операции записи он перемещается в конец файла. Вы можете переместить его, используя fseek или rewind в любом месте файла для чтения, , но операции записи переместят его обратно в конец файла.

0 голосов
/ 07 апреля 2011

Я только что понял что-то еще когда я открываю файл с помощью + b, скажем, файл без содержимого

$pointer = fopen("deneme.txt","a+b");
fwrite($pointer, rand(0,9));
echo fgetc($pointer);
echo ftell($pointer);
echo fgetc($pointer);

всегда печатает «1» на экране. Хорошо, если вы хотите прочитать файл, который вы перематываете, тогда проблем нет, но если я не использую перемотку, как в примере, ftell говорит, что позиция указателя равна 1. Так что если + это режим APPEND и помещает указатель в конец файла, то ftell врет, если он не врет, почему fgetc не возвращает ни одного символа? Ваш ответ будет "Просто используйте rewind ()", но я действительно запутался в этом!

...