elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado:


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  duda programa: no de devuelve el identificador como parametro de una funcion
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: duda programa: no de devuelve el identificador como parametro de una funcion  (Leído 1,147 veces)
gar

Desconectado Desconectado

Mensajes: 2


Ver Perfil
duda programa: no de devuelve el identificador como parametro de una funcion
« en: 24 Enero 2018, 20:57 pm »

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!!!!


En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.547



Ver Perfil
Re: duda programa: no de devuelve el identificador como parametro de una funcion
« Respuesta #1 en: 24 Enero 2018, 22:12 pm »

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:
Código
  1. FILE* abrir(char nom[], char b[]) {
  2.    FILE *fich;
  3.    char nombre[40], dni[40], apellido[100];
  4.  
  5.    fich = fopen(nom, b);
  6.  
  7.    // aquí el resto de la función
  8.  
  9.    return fich;
  10. }
  11.  
  12. int main() {
  13.  
  14.    // aquí el código de main hasta llegar a abrir, y entonces
  15.  
  16.    fichlec = abrir(nombre, b);
  17.  
  18.    // ...
  19. }

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

Código
  1. void abrir(char nom[],FILE **fich, char b[]) {
  2.    // ...
  3.    *fich = fopen(nom,b); // para acceder al contenido, que es FILE *
  4.  
  5.    // Ahora, si quieres ver la dirección debes hacer
  6.    printf(" valor del identificador:  %p         ------------\n", *fich); // recuerda, el contenido de fich es lo que se devolverá a main
  7. }
  8.  
  9. int main() {
  10.    // ...
  11.    abrir(nombre, &filelec, b)
  12.  
  13.    // para ver la dirección de filelec es de la forma habitual:
  14.    printf(" valor del identificador:  %p         ------------\n", fichlec);
  15. }

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


En línea

gar

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Re: duda programa: no de devuelve el identificador como parametro de una funcion
« Respuesta #2 en: 26 Enero 2018, 08:47 am »

muchisimas gracias!!!estaba empecinado en devolverlo como parametro y no con el return
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Matriz como parametro de una funcion
Programación C/C++
Dacan 8 8,468 Último mensaje 25 Marzo 2013, 16:39 pm
por Wofo
Pasar nombre de funcion como parametro de otra funcion en java
Java
xGisKaRDx 3 7,308 Último mensaje 1 Agosto 2014, 23:27 pm
por jhonatanAsm
[DUDA] ¿Porque la función math me devuelve resultados erroneos?
Java
JollyRoyer 3 1,608 Último mensaje 5 Marzo 2015, 18:54 pm
por Usuario Invitado
[Solucionado] Pasar una función como parámetro en C. « 1 2 »
Programación C/C++
NOB2014 19 7,477 Último mensaje 25 Septiembre 2016, 17:54 pm
por NOB2014
Duda con funcion que devuelve un struct
Programación C/C++
Naimaderis 1 1,820 Último mensaje 15 Julio 2017, 21:43 pm
por engel lex
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines