¿Vas a trabajar con ficheros de texto o binarios?. Lo que tienes que entender es que cuando escribes, no es como en el word, no "añades". Sobreescribes lo que haya en esa posición, es como escribir con el botón "insert" activo. Ej:
[utensilios]
//nombre, cantidad, precio
tornillo:22:29,5
Ese fichero así tal cual, ocupa 56Bytes (un byte por caracter, contando los \n sin retorno de carro). El número "22" está en el byte 49 del fichero, por lo tanto puedes hacer un
fseek (fichero , 49 , SEEK_SET );
fputs ( "23" , fichero );
Y el resultado será:
[utensilios]
//nombre, cantidad, precio
tornillo:23:29,5
El problema viene cuando quieras cambiar el 23 por un 1300 (por ejemplo). Al hacer lo mismo lo que ocurrirá será:
fseek (fichero , 49 , SEEK_SET );
fputs ( "1300" , fichero );
[utensilios]
//nombre, cantidad, precio
tornillo:13009,5
Eso te sobreescribe los datos que ya tenías, solo podrás almacenar números del 00 al 99. Una solución es que todos los campos (nombre, cantidad y precio) tengan un tamaño prefijado, de "10 espacios" (10 bytes) cada uno por ejemplo. Así, cuando quieras editarlo, te asegurarás de que no haya problemas porque tendrás espacio. Ej:
[utensilios]\n
//nombre, cantidad, precio\n
tornillo :23 :29,5 \n
tuerca :100 :29,5 \n
He marcado los saltos de linea para que se vea que en el precio tienes 10 espacios.Ahora puedes hacer
fseek (fichero , 51 , SEEK_SET );
fputs ( "1300" , fichero );
Sin ningún peligro. Además, te será útil tener los tamaños prefijados para moverte dentro del fichero con fseek.
Un saludo, y suerte