[ Foro de C ]

puntero FILE*

27-Aug-2007 06:10
Carlos Ruiz
3 Respuestas

Holap:

esteee... tengo otra duda:

Supongamos que tengo 2 punteros de tipo FILE*:

FILE* yo_primero, yo_despues;

...y abro un archivo con "yo_primero":

yo_primero=fopen("datos.xxx","wb"); 

...entonces: puedo después apuntar al archivo con "yo_despues" y usar "yo_primero" para otro archivo?? así:

yo_despues=yo_primero;

...

fread(arreglo, sizeof(char),1,archivo);

...

yo_primero=fopen("otros_datos.xxx","wb"); 

...en el fondo la pregunta es, ¿puedo trabajar en un mismo archivo con 2 punteros al mismo tiempo?

He estado experimentando, pero todo se comporta muy raro. Por ejemplo, supongamos que abro el archivo con yo_primero, y luego hago yo_despues=yo_primero; inmediatamente despues de abrirlo (antes de hacer NADA con el archivo), y luego hago cosas sólo en base al puntero yo_primero y todavía nada con yo_despues... pues bien, lo que ocurre es que el puntero yo_despues AVANZA JUNTO con yo_primero (y no se queda apuntado al principio del archivo como debería esperarse...). De hecho, tengo que hace un rewind(archivo); para que yo_despues esté al principio...

Entonces, estimado Nacho Cabanes (o quien quiera ayudarme... : ), ¿Podrías explicarme más sobre este tema de los punteros FILE*, please?

SAludos

Carlos.


27-Aug-2007 06:53
Carlos Ruiz

La verdadera pregunta que me interesa hacer sobre este tema es:

Puedo abrir un archivo con un puntero y cerrarlo con otro? (y luego seguir ocupando el puntero con el que lo abrí, para abrir otros archivos?)

Espero la respuestaa.

Saludos.

Carlos.


29-Aug-2007 13:34
Taisen Tetsu

Pero no es más facil abrir el otro archivo con el otro puntero directamente? si es simplemente porque el ahora al abrir otro se combierte en despues, nose usa otro nombre :P. Pero lo que quieres hacer es un poco complicarse la vida. Igualmente, respondiendo a tu pregunta, yo creo que no se puede hacer con una igualación.Nose si habra alguna manera de hacerlo, pero con un igual no creo.


07-Sep-2007 10:55
Nacho Cabanes (+83)

El puntero está asociado a ese archivo. Recuerda que un puntero es una dirección de memoria. Por tanto, en esa posición de memoria está la información necesaria para acceder al fichero, y esa dirección de memoria es la correcta para cerrar el fichero.

Siendo masoquista, podrías crear un nuevo puntero que inicialmente estuviera vacío, asignarle el valor de la otra dirección (la asociada al fichero) y entonces usarlo para cerrar el fichero. Pero este método tiene dos problemas:

a) Trabajas el triple, lo cual, de por sí, es absurdo.

b) Haces tu programa mucho más difícil de leer, lo que tampoco se debe hacer.

Lo razonable es que uses un puntero para cada fichero QUE NECESITES TENER ABIERTO A LA VEZ. Abres el fichero con ese, lo manipulas con ese puntero, lo cierras con ese puntero.

Por ejemplo, si tu programa procesa 2000 ficheros dentro de un bucle (for, while, ...), pero uno por uno (abre, manipula, cierra), en vez de usar 200 punteros, usas sólo uno para abrir todos los ficheros, ya que nunca hay dos ficheros abiertos a la vez.

Por el contrario, si tu programa trabaja con dos ficheros a la vez (uno de entrada y uno de salida, por ejemplo), usarías dos punteros, uno para cada uno: FILE *ficheroEntrada, *ficheroSalida;

Y si tu fichero necesita manejar 2000 ficheros a la vez, no uno por uno, sino accediendo a todos en el mismo momento, tienes un 99,5% de probabilidades de que haya un gran fallo de diseño y un 0,5% de probabilidades de que realmente sea un proyecto ENORME, y en ese caso podría ser más cómodo no declarar 2000 variables FILE sino un array de ficheros.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)