Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: JJShadiw en 23 Diciembre 2010, 15:59 pm



Título: [C] Problema con nombres de ficheros
Publicado por: JJShadiw en 23 Diciembre 2010, 15:59 pm
Hola a todos. Estoy realizando un programa en C, en el cual inicialmente abro dos archivos, cuyos nombres de quedan almacenados en 2 cadenas de caracteres y son los siguientes:

caso1.sec
caso2.sec

Pues bien, mi problema viene es que ahora necesito crear un fichero de salida que contenga los nombres de cada uno (sin la extensión) separados por un -, y la extensión .out. Quedaría de esta manera:

caso1-caso2.out

Y por más que lo intento, no consigo sacarlo. No puedo escribir directamente "caso1-caso2.out" ya que los nombres de los ficheros pueden ser diferentes, tengo que hacerlo de modo general. Lo he intentado con el siguiente código, pero me da error (me devuelve NULL) a la hora de crear el fichero .out:

Código
  1. for (i=0;nomFich1[i]!='.';i++)
  2.            {
  3.                fichSal[i]=nomFich1[i];
  4.            }
  5.            fichSal[i]='-';
  6.            i++;
  7.            for(j=0;nomFich2[j]!='.';j++){
  8.                fichSal[i]=nomFich2[j];
  9.                i++;
  10.            }
  11.            strcat(fichSal,".out");

Donde nomFich1 es la cadena donde está almacenado "caso1.sec", nomFich2 donde se encuentra "caso2.sec" y fichSal nombre del fichero que debo crear.

¿Dónde está el fallo? ¿Hay alguna manera más fácil de realizar lo que pido?

Gracias!


Título: Re: [C] Problema con nombres de ficheros
Publicado por: dooque en 23 Diciembre 2010, 19:57 pm
Wenas!

Si bien el codigo q pusiste no parce estar mal, no pusiste la parte en donde creas el fichero y te devuelve NULL asi que no podemos decirte x q te devuelve NULL!

Ahora dos observaciones respecto del codigo:

1) Trata de identar bien asi es mas legibe. Muchos errores vienen por un feo coding-style, ademas con buen codigo se pueden encontrar errores mas facilmente! A primera vista pareceria que todo esta dentro del primer for cuando no es asi, y lo que engaña es la visual.

2) Estas usando la funcion strcat(fichSal,".out");, que no esta mal pero tenes que tener mucho cuidado, si no inicializaste bien tus cadenas podes hacer mucho lio! Las funciones de C de este tipo asumen que las cadenas terminan con un 0 al final, y si no es el caso, vas a tener muchos problemas!

Asi que pone un poco mas de codigo (las declaraciones de las variables que usas y como crear el archivo, como los abris etc.) asi entendemos un poco mas y te podemos ayudar a resolver cual es el problema!

Saludos!


Título: Re: [C] Problema con nombres de ficheros
Publicado por: JJShadiw en 23 Diciembre 2010, 22:30 pm
Gracias por tus consejos dooque. Este es el código de mi programa (en realidad hay más funciones, pero no tienen nada que ver con lo que pregunto):

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define MAXCAR 50
  5. #define TAM 300
  6.  
  7. int cargarFichero1(char [MAXCAR], char [TAM]);
  8. int cargarFichero2(char [MAXCAR], char [TAM]);
  9. void guardarMatrizDePuntos(char [MAXCAR], char [TAM], int, char [TAM], int);
  10. void main()
  11. {
  12.    char nomFich1[MAXCAR],nomFich2[MAXCAR],fichSal[MAXCAR];
  13.    char s1[TAM],s2[TAM];
  14.    int n1,n2,i,j;
  15.  
  16.    do
  17.    {
  18.        n1=cargarFichero1(nomFich1,s1);
  19.    }
  20.    while (n1==-1);
  21.  
  22.    do
  23.    {
  24.        n2=cargarFichero2(nomFich2,s2);
  25.    }
  26.    while(n2==-1);
  27.  
  28.  
  29.    for (i=0;nomFich1[i]!='.';i++)
  30.    {
  31.        fichSal[i]=nomFich1[i];
  32.    }
  33.    fichSal[i]='-';
  34.    i++;
  35.    for(j=0;nomFich2[j]!='.';j++)
  36.    {
  37.        fichSal[i]=nomFich2[j];
  38.        i++;
  39.     }
  40.     strcat(fichSal,".out");
  41.     guardarMatrizDePuntos(fichSal,s1,n1,s2,n2,puntos);
  42. }
  43.  
  44.  
  45. int cargarFichero1(char nomFich [MAXCAR], char s[TAM])
  46. {
  47.    FILE *f;
  48.    int i,cont;
  49.    printf("Introduce el nombre del fichero con la primera secuencia (sin extension): ");
  50.    gets(nomFich);
  51.    strcat(nomFich,".sec");
  52.    f=fopen(nomFich,"r");
  53.    if (f==NULL)
  54.    {
  55.        printf("ERROR: El fichero %s no se pudo abrir\n",nomFich);
  56.        return -1;
  57.    }
  58.    else
  59.    {
  60.        i=0;
  61.        cont=-2;
  62.        s[i]=fgetc(f);
  63.        while (!feof(f))
  64.        {
  65.            i++;
  66.            s[i]=fgetc(f);
  67.            cont++;
  68.        }
  69.        fclose(f);
  70.        return cont;
  71.    }
  72. }
  73.  
  74.  
  75. int cargarFichero2(char nomFich [MAXCAR], char s[TAM])
  76. {
  77.    FILE *f;
  78.    int i,cont;
  79.    printf("Introduce el nombre del fichero con la segunda secuencia (sin extension): ");
  80.    gets(nomFich);
  81.    strcat(nomFich,".sec");
  82.    f=fopen(nomFich,"r");
  83.    if (f==NULL)
  84.    {
  85.        printf("ERROR: El fichero %s no se pudo abrir\n",nomFich);
  86.        return -1;
  87.    }
  88.    else
  89.    {
  90.        i=0;
  91.        cont=-2;
  92.        s[i]=fgetc(f);
  93.        while (!feof(f))
  94.        {
  95.            i++;
  96.            s[i]=fgetc(f);
  97.            cont++;
  98.        }
  99.        fclose(f);
  100.        return cont;
  101.    }
  102. }
  103.  
  104.  
  105. void guardarMatrizDePuntos(char nomFich[MAXCAR], char s1[TAM], int n1, char s2[TAM], int n2)
  106. {
  107.    FILE *f;
  108.    f=fopen(nomFich,"w");
  109.    if (f==NULL)
  110.        printf("Error al crear el fichero");
  111.    else
  112.    {
  113.        fprintf(f,"# MATRIZ DE PUNTOS #\n");
  114.        fprintf(f,"\n");
  115.        fprintf(f," ");
  116.        fprintf(f,"%s\n",s2);
  117.    }
  118.    fclose(f);
  119. }

Ese es el código en el cual intervienen las variables de mi problema. Cuando llamo a la última función (guardarMatrizDePuntos), siempre me muestra por pantalla "Error al crear el fichero"


Título: Re: [C] Problema con nombres de ficheros
Publicado por: dooque en 24 Diciembre 2010, 00:22 am
Bien...

Sigo sin ver el error leyendo el codigo. Intente debuguearlo con gdb pero me di cuena que no pusiste todo el codigo!

Es probable que el error sea con las cadenas, pero sin correrlo no estoy seguro! Proba inicializar todos los arreglos que uses a cero con la funcion memset() (http://www.manpagez.com/man/3/memset/ (http://www.manpagez.com/man/3/memset/)) capas eso te solucione algo!

Como no pude ayudarte con el error te doy otro consejo para el codigo:

Fijate que las funciones
int cargarFichero1(char [MAXCAR], char [TAM]);
int cargarFichero2(char [MAXCAR], char [TAM]);

hacen exactamente lo mismo, es el mismo codigo, lo unico que cambia es el nombre del archivo. Lo mejor, o en realidad lo que deberias hacer, es una sola funcion que haga el trabajo, despues de todo para eso son las funciones, cuando uno necesita una funcionalidad mas de una ves, crea una funcion para no repetir el mismo codigo dos veces, entonces uno piensa como podria funcionar el codigo de forma general y lo "generaliza", valga la redundancia, en una funcion! Es algo que tenes que aprender y acostumbrarte a hacer, por ahi al principio cuesta abstraerce un poco, pero con practica te vas a ir dndo cuenta!

Saludos!