为了账号安全,请及时绑定邮箱和手机立即绑定

如何在大文件中的最后一个字符之前插入字符串

如何在大文件中的最后一个字符之前插入字符串

PHP
慕码人8056858 2022-10-28 15:46:44
我有一个由单个字符串组成的非常大的文件。由于文件的大小,我不想将整个字符串读入内存。最后一个字符将始终是右括号],因为此字符串是 json 数组。我想在右括号之前插入一个小的 json 对象(表示为字符串)。我已经看到了一些想法,但无法得到任何工作。如您所见,我正在尝试打开文件并使用fseek将文件指针移动到]. 然后我尝试将新字符串写入该位置的现有字符串。但是,这样做的效果只是将新字符串附加到现有字符串的末尾,这不是我想要的。作为一个简化的示例,假设文件开始时包含以下字符串:[{"name":"alice","city":"london"}]然后我想使用以下代码将第二个人添加到此列表中:$new_person = ",{\"name\":\"bob\",\"city\":\"paris\"}";$filename = "people.json";$fh = fopen($filename, "a+");$filesize = filesize($filename);$stat = fstat($fh);fseek($fh, $stat[$filesize]-1);fwrite($fh, $new_person);fclose($fh); 但我最终得到的是一个包含此字符串的文件:[{"name":"alice","city":"london"}],{"name":"bob","city":"paris"}我的 PHP 技能很糟糕。我不知道我fseek是指向错误的位置还是问题出在其他地方。谢谢你的帮助。
查看完整描述

2 回答

?
守候你守候我

TA贡献1802条经验 获得超10个赞

文档(强调我的):

a+:开放读写;将文件指针放在文件末尾。如果该文件不存在,请尝试创建它。在这种模式下, fseek() 只影响读取位置,写入总是附加的。

改为使用r+模式,而不是fstat你可以这样做:

fseek($fh, -1, SEEK_END);


查看完整回答
反对 回复 2022-10-28
?
MYYA

TA贡献1868条经验 获得超4个赞

请尝试以下代码以获得您的解决方案,我已经测试并且它工作正常......


try{

    $new_person = ",{\"name\":\"bob\",\"city\":\"paris\"}]";

    $filename = "people.json";

    $fh = fopen($filename, "a+");

    $stat = fstat($fh);

    ftruncate($fh, $stat['size'] - 2);

    fwrite($fh, $new_person);

    fclose($fh); 

}catch(Exception $exc){

    echo($exc->getMessage());

}


查看完整回答
反对 回复 2022-10-28
  • 2 回答
  • 0 关注
  • 132 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号