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

问题描述 投票:0回答:2

我有一个很大的文件,由一个字符串组成。由于文件的大小,我不想将整个字符串读入内存。

最后一个字符将始终是右括号],因为此字符串是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是指向错误的位置还是问题出在其他地方。感谢您的帮助。

php fseek
2个回答
2
投票

docs(强调我):

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

使用r+模式代替,可以代替fstat

fseek($fh, -1, SEEK_END);

0
投票

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

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());
}
© www.soinside.com 2019 - 2024. All rights reserved.