Código
i = 3;
e inmediatamente despues haces
Código
i = 5;
que crees que pasa con el 3?
Si en un programa tuvieras esto:
Código
i = 3; i = 5;
la primera linea seria completamente superflua, podrias eliminarla y el programa funcionaria igual.
Esto que parece obvio se puede ocultar en el paso de parametros de una funcion.
Código
void f(int i) { i = 5; } int main() { f( 3 ); // ... }
Es lo mismo anterior, pero usando el paso de parametros. A i se le asigna 3 y luego se le asigna 5, no se usa el valor 3, se sobreescribe con el 5 posterior.
No tiene sentido invocar f(3), si lo primero que se hace en f es ignorar lo que se pasa y usar un valor distinto.
Eso estas haciendo en tus funciones que pasan como parametro una referencia a un archivo (cerrado, o no), y que lo primero que hace es reasignar la referencia a algo mas.
Tu programa funcionaria igual sin poner ni pasar ese parametro, si lo pasas, no cierres el archivo, si lo cierras antes, no lo pases.
En tu caso, parece que lo que corresponde es la primera opcion.