fopen有一些奇怪的行为

时间:2011-03-11 17:29:52

标签: php fopen fgetc

我有一个名为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 个答案:

答案 0 :(得分:3)

您需要了解a+模式。

它打开文件以供阅读和追加(在文件末尾写入)。如果文件不存在,则创建该文件。用于阅读的初始文件位置位于文件的开头,但输出始终附加到文件的结束

只有一个指针最初位于文件的开头,但是当尝试写入操作时,它会移动到文件的末尾。您可以使用fseekrewind在文件中的任何位置重新定位,以便阅读,但写入操作会将其移回文件末尾。

答案 1 :(得分:0)

我只是想出了别的东西 当我打开一个带有+ 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不会返回任何字符? 你的答案是“只是使用倒带()”,但我真的对此感到困惑!