O "problema" se resume a como os arquivos são gravados na mídia de armazenamento, byte a byte.
Em sua representação mais básica, um arquivo nada mais é do que uma série de bytes gravados no disco (também conhecido como meio de armazenamento). Portanto, sua string original se parece com:
Address Value
0x00 `a`
0x01 `a`
0x02 `a`
0x03 `b`
0x04 `d`
0x05 `d`
0x06 `d`
E você deseja inserir C
na posição 0x04. Isso requer a alteração de bytes de 4 a 6 para um byte, para que você possa inserir o novo valor. Caso contrário, você substituirá o valor atualmente em 0x04, que não é o que você deseja.
Address Value
0x00 `a`
0x01 `a`
0x02 `a`
0x03 `b`
0x04 `C`
0x05 `d`
0x06 `d`
0x07 `d`
Portanto, a razão pela qual você deve reescrever a cauda do arquivo após inserir um novo valor é porque não há espaço no arquivo para aceitar o valor inserido. Caso contrário, você escreveria o que estava lá.
Adendo 1 : Se você deseja substituir o valor de b
por C
, não será necessário reescrever a cauda da string. Substituir um valor por um valor de tamanho semelhante não requer uma reescrita.
Adenda 2 : Se você queria substituir a string ab
com C
então você teria necessidade de re-escrever o resto do arquivo como você criou uma lacuna no arquivo.
Adendo 3 : Construções em nível de bloco foram criadas para facilitar o manuseio de arquivos grandes. Em vez de precisar encontrar 1 milhão de espaço contíguo para o seu arquivo, agora você só precisa encontrar 1 milhão de blocos disponíveis para gravar.
Em teoria, você pode construir um sistema de arquivos que faça a ligação byte a byte semelhante ao que os blocos fornecem. Em seguida, você pode inserir um novo byte, atualizando o para | dos ponteiros no ponto apropriado. Eu arriscaria um palpite de que o desempenho seria muito ruim.
Como o Grandmaster B sugeriu , use uma imagem de dominó empilhado para entender visualmente como o arquivo é representado.
Você não pode inserir outro dominó na linha de dominós sem fazer com que tudo caia. Você precisa criar o espaço para o novo dominó movendo os outros para baixo da linha. Mover dominós para baixo da linha é o equivalente a reescrever a cauda do arquivo após o ponto de inserção.