使用fseek在最后一行之前插入字符串

时间:2012-03-19 01:07:08

标签: php fwrite fseek

我正在尝试为blueimp.net的AjaxChat编写一个非常基本的注册模块。我有一个写入用户配置文件的脚本。

$userfile = "lib/data/users.php";
$fh = fopen($userfile, 'a');
$addUser = "string_for_new_user";
fwrite($fh, $addUser);
fclose($fh);

但我需要在最后一行之前插入$addUser,即?>

我如何使用fseek完成此操作?

2 个答案:

答案 0 :(得分:2)

如果总是知道文件以?>结尾?仅此而已,你可以:

$userfile = "lib/data/users.php";
$fh = fopen($userfile, 'r+');
$addUser = "string_for_new_user\n?>";
fseek($fh, -2, SEEK_END);
fwrite($fh, $addUser);
fclose($fh);

要进一步改善答案:由于关于r+ fseek的{​​{3}},您需要以模式fseek($fh, -2, SEEK_END)打开文件:

  

注意:

     

如果您已在附加(a或+)模式下打开文件,那么您有任何数据   无论文件如何,都将始终追加写入文件   位置,调用fseek()的结果将是未定义的。

?>将位置放在文件末尾,然后向后移动2个字节({{1}}的长度)

答案 1 :(得分:0)

另一种实现此目的的方法是使用SplFileObject class(从PHP 5.1开始提供)。

$userfile = "lib/data/users.php";
$addUser = "\nstring_for_new_user\n";
$line_count = 0;

// Open the file for writing
$file = new SplFileObject($userfile, "w");

// Find out number of lines in file
while ($file->valid()) {
   $line_count++;
   $file->next();
}

// Jump to second to last line
$file->seek($line_count - 1);

// Write data
$file->fwrite($add_user);

我没有测试过这个(我现在不能在我正在使用的计算机上),所以我不确定它是否完全正常。这里的要点实际上是SplFileObject的酷seek()方法,它可以按行搜索,而不是fseek()按字节搜索。