duda programa: no de devuelve el identificador como parametro de una funcion

Iniciado por gar, 24 Enero 2018, 20:57 PM

0 Miembros y 1 Visitante están viendo este tema.

gar

buenas a todos,
mi duda es que tengo que crear un programa donde una de las partes es crear una funcion para abrir un archivo pasandole como parametro de entrada el nombre de archivo y el "r" de read (que ahora no me acuerdo como se llama el parametro) y me devuelva el identificador del archivo.
el problema es que el identificador no me lo devuelve bien, he probado a printearlos dentro de la funcion y en el main y tienen diferente valor.
si printeo el archivo dentro de la funcion me lo hace bien, pero di lo intento fuera de la funcion no. esta claro que esto es por el identificador, que no lo recoge bien el main.
por que puede ser????

os dejo el programa y el archivo a leer:
texto.txt:
12345        jorge       gomez
43212        andrea         perez
con los campos separados por tabulador

programa:
__________________________________________________________________________
#include <stdlib.h>
#include <stdio.h>
void abrir(char nom[],FILE *fich, char b[]){
     char nombre[40],dni[10],apellido[100];
   
     fich=fopen(nom,b);
     
     fscanf (fich, " %[^\t]",dni);                 
     fscanf (fich, " %[^\t]",nombre);
     fscanf (fich, " %[^\t]",apellido);
     
     printf("%s    %s     %s\n",dni,nombre,apellido);
     printf(" valor del identificador:  %d         ------------\n",fich);
}

int main(){
    FILE *fichlec,*fichesc;
    char nombre[40],apellido[100],dni[10],nom[100],b[]="r";

    printf ("introduce el nombre del archivo de lectura");
    scanf ("%s",nombre);
   
    abrir(nombre,fichlec, b);
    printf("hasta aqui funciona bien\n");
   
    printf("aqui imprimo otro valor de identificador y rompo en el fscanf\n");
    printf(" valor del identificador:  %d         ------------\n",fichlec);
    fscanf (fichlec, " %[^\t]",dni);   
    printf("AAAAAAAAAAAAAAAAAAAA");             
    fscanf (fichlec, " %[^\t]",nom);
    fscanf (fichlec, " %[^\t]",apellido);
    printf("%s    %s     %s",dni,nom,apellido);
    system("pause");
}
_______________________________________________________________________

alguna idea de por que puede ser?como tengo que hacer el llamamiento a la funcion para que me lo devuelva bien??

gracacias!!!!

MAFUS

No sé como vas de punteros pero te cuento:
Como sabes los parámetros se pasan a las funciones por valor, eso quiere decir que a la vuelta el parámetro no se habrá modificado.
Cuando pasas un puntero como parámetro de una función, dentro de ella podrás modificar el contenido de esa memoria, no el puntero en sí, que una vez que regreses, y recuerda que lo has pasado por valor (es decir, una copia) éste no se habrá modificado.
Es muy importante que memorices estos conceptos.

Ahora. La función fopen devuelve un puntero, es decir, genera una estructura en algún sitio de forma dinámica y nos devuelve el puntero al principio. Pretendes que ese puntero se quede guardado en el argumento que le pasas a la función, pero lo por explicado más arriba esa información no puede salir de la función, en main sigue el puntero original y por tanto se pierde.

¿Cómo podrías solucionar esto?
Haciendo que la función devuelva un puntero a FILE, es decir:
FILE* abrir(char nom[], char b[]) {
    FILE *fich;
    char nombre[40], dni[40], apellido[100];

    fich = fopen(nom, b);

    // aquí el resto de la función

    return fich;
}

int main() {

    // aquí el código de main hasta llegar a abrir, y entonces

    fichlec = abrir(nombre, b);

    // ...
}


O si te interesa pasar el parámetro sí o sí como argumento tendría que ser como puntero a puntero. La idea es: sabiendo que se puede cambiar el contenido de un puntero, pero no el puntero en sí, debes dar ese puntero (FILE *) como dato (de un puntero anterior que será el que se copiará) para que así se pueda modificar.

Por cierto, printf tiene un carácter de control para ver la dirección de los punteros: %p

void abrir(char nom[],FILE **fich, char b[]) {
    // ...
    *fich = fopen(nom,b); // para acceder al contenido, que es FILE *

    // Ahora, si quieres ver la dirección debes hacer
    printf(" valor del identificador:  %p         ------------\n", *fich); // recuerda, el contenido de fich es lo que se devolverá a main
}

int main() {
    // ...
    abrir(nombre, &filelec, b)

    // para ver la dirección de filelec es de la forma habitual:
    printf(" valor del identificador:  %p         ------------\n", fichlec);
}


Y recuerda que al terminar debes cerrar los archivos con fclose.

gar

muchisimas gracias!!!estaba empecinado en devolverlo como parametro y no con el return