php - fopen 有一些奇怪的行为

标签 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

你对此有什么想法吗?

最佳答案

您需要了解a+模式。

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

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

关于php - fopen 有一些奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5276272/

相关文章:

php - PHP-无法打开流:没有这样的文件或目录

C 检测文件末尾的最后一个新行

c - 为什么 ftell 会跳过文件中的某些位置?

php - CodeIgniter 基本 Controller 扩展

php - 无法安装 mbstring php 冲突

php - Laravel 5.4 - 在集合中使用自定义属性模型

php - JQUERY getJSON/ajax 响应未处理

c - 从文件中读取字符串到C中动态分配的数组

c - 用C读取带有空格的文件.txt

c - fgetc,检查 EOF