a+ 和 fopen() 的模式

a+ and a mode with fopen()

提问人:ray 提问时间:6/11/2015 最后编辑:Jahidray 更新时间:9/22/2018 访问量:7686

问:

根据手册,如果在功能中选择模式,文件指针将放在末尾。a/a+fopen()

但是为什么我使用 the 和 still 返回得到 0 ?如果文件指针位于末尾。ftell()feof()false

例如:

$handle=fopen("./file.txt","w");
fwrite($handle,1234567890);
fclose($handle);
$handle=fopen("./file.txt","a+");
echo getc($handle);
fclose($handle);

我得到了 1,但如果文件指针放在最后,我不应该得到 0 吗?

php fopen 模式 feof ftell

评论

0赞 ChristianM 6/11/2015
您是否尝试过实际将字符串而不是整数写入文件?
0赞 ray 6/11/2015
是的,我有。但结果还是一样的。
0赞 ray 6/11/2015
使用 ftell() 可能是一个坏主意。但是如果我选择 a+ 模式,为什么 fgetc() 仍然返回文件的第一个字符?A+ 模式将文件指针放在最后。

答:

1赞 Lightness Races in Orbit 6/11/2015 #1

就在文档中,靠近顶部:

ftell()为仅追加流提供未定义的结果(以“a”标志打开)。

评论

0赞 ray 6/11/2015
使用 ftell() 可能是一个坏主意。但是如果我选择 a+ 模式,为什么 fgetc() 仍然返回文件的第一个字符?A+ 模式将文件指针放在最后
0赞 Lightness Races in Orbit 6/11/2015
@ray:内部读取游标和写入游标之间可能存在差异。我猜PHP只是试图让它们保持同步,但并没有特意去检测它们何时开始生活。在追加模式下直接从 POSIX 打开文件时,写入游标位于末尾,而读取游标位于开头
3赞 Daniel W. 6/11/2015 #2

a+意思是,从头开始读到最后。

这就是为什么你从流中得到一个焦炭。

在内部,您有两个流,并且 .STDINSTDOUT

评论

0赞 ray 6/11/2015
但文件指针放在最后。这不会影响 fread()、fgets() 吗?
0赞 Lightness Races in Orbit 6/11/2015
@ray:有不止一个文件指针,不管PHP的抽象让你怎么想。
0赞 Daniel W. 9/3/2019
应该记住,实际上没有用例可以同时读取和写入文件,而无法分离这些步骤,无论如何这更安全。
2赞 Rashy 1/12/2017 #3

"a" - 仅写入。打开并写入文件末尾,或者创建一个新文件(如果该文件不存在)。

"a+" - 读/写。通过写入文件末尾来保留文件内容。