【问题标题】:PHP fopen with c/c+ modePHP fopen 与 c/c+ 模式
【发布时间】:2019-10-11 07:57:43
【问题描述】:

就我对 c/c+ 模式的理解而言,我期待像 'a/a+ 模式这样的行为,因此不应截断文件,并且任何 fwrite() 结果都应添加到现有文件中。

事实上,文件似乎被截断了,因为文件总是只包含最后的 fwrite() 内容。

这可能是我的 PHP 版本 (7.0) 中的错误,还是我误解了什么?

<?php
$fp = fopen($fpath,'c+');
fwrite($fp, date("H:i:s")." test\n");
fclose($fp);

【问题讨论】:

  • 它不会在打开文件时截断文件。但是是什么让您认为它会添加到文件中?即使没有指定(据我所知),fwrite 也可能会覆盖数据。有人在documentation for fwrite 中对此发表了评论。
  • 不是您问题的真正答案,但如果您只想附加内容,您可以使用 file_put_contents($file, $content, FILE_APPEND); 代替。更短更容易。
  • @fredrik 谢谢,这解释了一切!
  • @MagnusEriksson 这绝对是目前最好的解决方案。谢谢!
  • 它可以带有标志LOCK_EX。所以只需同时使用FILE_APPEND|LOCK_EX

标签: php fread


【解决方案1】:

是什么让您认为这应该表现得不同?根据文档,使用c 指针“位于文件的开头”。从该特定位置开始写入,您将始终覆盖该文件中已经存在的任何内容

【讨论】:

  • 非常感谢。我专注于“模式”,完全忽略了 fwrite() 的行为方式。
【解决方案2】:

也许是对前面所说的一点补充:

<?php 
/* file test.txt contains string(4): 'test' */
$fp = fopen('test.txt','c+');
fclose($fp);

文件test.txt 不会被截断为零长度(就像ww+fopen() 所做的那样), 它仍然包含字符串(4):test

现在看看当我们使用c+向文件中写入一个字符时会发生什么

$fp = fopen('test.txt','c+');
fwrite($fp, 'b');
fclose($fp);

文件test.txt 现在包含:best,文件指针定位在文件的开头并且只覆盖了原始文件中的第一个字符 - test 变成了best

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多