Tem algum lugar, fora a memória, que tu esteja armazenando o i?? Nas suas gravações, não me recordo se o fwrite posiciona automaticamente no final do arquivo, isso acontece ou ele grava em cima de algo se tiver algo escrito? O seu i pelo que vi é um indice, este indice tem que ser salvo e recuperado na abertura do programa, para que tu não perca a referencia de quantos registros possiu o arquivo. Ou tu coloca o i fora da função, direto no main de seu programa e adiciona a passagem dele a função. Quanto ao fwrite, é + um warning meu pois não me recordo e eu sempre uso fseek antes. Espero ter dado + uma ajuda! abraços!