Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Problema con funcion remove(const char *)

Estas en el tema de Problema con funcion remove(const char *) en el foro de C/C++ en Foros del Web. Hola todos. Veran, tengo el siguiente programa que utiliza archivos, lo que hace es leer un archivo, cuya estructura se comprone primeramente de una orden, ...
  #1 (permalink)  
Antiguo 06/11/2013, 13:49
Avatar de omar10594  
Fecha de Ingreso: junio-2013
Ubicación: Mexico
Mensajes: 26
Antigüedad: 10 años, 10 meses
Puntos: 3
Problema con funcion remove(const char *)

Hola todos.

Veran, tengo el siguiente programa que utiliza archivos, lo que hace es leer un archivo, cuya estructura se comprone primeramente de una orden, comando, o sentencia a realizar, en este caso es ADD, PRINT o SORT, luego de la orden, en caso de ser ADD deben estar los datos de clave, nombre, edad, sexo, si la orden es PRINT entonces lo que debe estar despues es el nombre del archivo donde seran guardados los datos, SORT es solo para ordenar los datos de menos a mayor la clave.

Todo me anda perfecto, solo que tengo un archivo "auxiliar.txt" que es el que me ayuda a guardar los datos temporalmente ahi para luego guardarlos en un archivo cuando se presente la sentencia PRINT, tambien podria usar un arreglo de cadenas con tamaño dinamica, pero en este caso quiero hacerlo de esta manera, pues quiero aprender bien, bien archivos. Bueno, entonces, este archivo "auxiliar.txt" quisiera borrarlo una vez que termina el programa para que asi solo se vean los archivos creados, y para borrarlo utilizo la funcion remove, la cual en mi programa la uso una vez y me anda perfecto (pero es con otro archivo), pero cuando quiero borrar "auxiliar.txt" no lo borra, mas concretamente, no lo puede borrar, pues me regresa un valor de -1, osea que no tuvo exito, pues devuelve un 0 si si lo logro, y por mas vueltas que le doy al codigo no encuentro donde esta mi error, supuse que era que a lo mejor no habia puesto un fclose(), pero realmente que no lo encuentro.

Aqui les dejo el codigo, a lo mejor es otro error el que tengo, cuando miren el codigo, deseguro notaran otros errores, o codigo que pudo escribirse de mejor manera, lo se, pero por mientras quisiera arreglar solamente esto del remove()

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4. #include <string.h>
  5. #define ADD     0
  6. #define PRINT   1
  7. #define SORT    2
  8.  
  9. typedef struct Tdato{
  10.                      long clave;
  11.                      char nombre[45]={0};
  12.                      int edad;
  13.                      char sexo[10];
  14.                     }tdato;
  15.  
  16. void fcomandos( void );
  17. int accion(FILE **archivo);
  18. void add(FILE **archivo);
  19. void add2(FILE **archivo);
  20. void print(FILE **archivo);
  21. void ordenar(void);
  22. const char* leelinea(FILE **archivo);
  23. int lineas(void);
  24.  
  25. int main( void )
  26. {
  27.     fcomandos();
  28.     return 0;
  29. }
  30.  
  31. void fcomandos( void )
  32. {
  33.     FILE *fcomandos;
  34.     fcomandos = fopen("comandos.txt","r");
  35.     while(!feof(fcomandos))
  36.     {
  37.         switch(accion(&fcomandos))
  38.         {
  39.             case ADD:
  40.                 add(&fcomandos);
  41.                 break;
  42.             case PRINT:
  43.                 print(&fcomandos);;
  44.                 break;
  45.             case SORT:
  46.                 ordenar();
  47.                 break;
  48.             case -1:
  49.                 printf("\t\tERROR\n\tOrden no definida");
  50.                 break;
  51.         }
  52.     }
  53.     fclose(fcomandos);
  54.     printf("%d\n",remove("auxiliar.txt"));
  55.     system("pause");
  56. }
  57.  
  58. int accion(FILE **archivo)
  59. {
  60.     char comando[7];
  61.     char comandos[3][7]={{"ADD"},{"PRINT"},{"SORT"}};
  62.     fscanf(*archivo,"%s",&comando);
  63.     for(int i=0 ; i<3 ; i++)
  64.         if(strcmpi(comandos[i],comando)==0)
  65.             return i;
  66.     return -1;
  67. }
  68.  
  69. void add(FILE **archivo)
  70. {
  71.     FILE *faux;
  72.     tdato reg;
  73.     char letra;
  74.     int i=0;
  75.     faux = fopen("auxiliar.txt","a");
  76.     fscanf(*archivo,"%ld",&reg.clave);
  77.     do
  78.     {
  79.         fscanf(*archivo,"%c",&letra);
  80.         if(letra<48||letra>57)
  81.         {
  82.             reg.nombre[i]=letra;
  83.         }
  84.         i++;
  85.     }while(letra<48||letra>57);
  86.     reg.nombre[i]='\0';
  87.     fscanf(*archivo,"%d",&reg.edad);
  88.     fscanf(*archivo,"%s",&reg.sexo);
  89.     fprintf(faux,"%-8ld",reg.clave);
  90.     fprintf(faux,"%-45s",reg.nombre);
  91.     fprintf(faux,"%c",letra);
  92.     fprintf(faux,"%-4d",reg.edad);
  93.     fprintf(faux,"%s\n",reg.sexo);
  94.     fclose(faux);
  95. }
  96.  
  97. void print(FILE **archivo)
  98. {
  99.     FILE *faux, *fnuevo;
  100.     char nombre[15], letra;
  101.     faux = fopen("auxiliar.txt","r");
  102.     fscanf(*archivo,"%s",&nombre);
  103.     fnuevo = fopen(nombre,"w");
  104.     while(!feof(faux))
  105.     {
  106.         fscanf(faux,"%c",&letra);
  107.         fprintf(fnuevo,"%c",letra);
  108.     }
  109.     fclose(faux);
  110. }
  111.  
  112. void ordenar(void)
  113. {
  114.     FILE *faux, *faux2;
  115.     int nlineas, j, i;
  116.     nlineas=lineas();
  117.     char linea1[100], linea2[100], letra;
  118.     for(j=0;j<nlineas-2;j++)
  119.     {
  120.         faux = fopen("auxiliar.txt","r");
  121.         faux2 = fopen("auxiliar2.txt","w");
  122.         strcpy(linea1,leelinea(&faux));
  123.         for(i=0;i<nlineas-1;i++)
  124.         {
  125.             strcpy(linea2,leelinea(&faux));
  126.             if(strcmp(linea1,linea2)>0)
  127.             {
  128.                 fprintf(faux2,"%s",linea2);
  129.             }
  130.             else
  131.             {
  132.                 fprintf(faux2,"%s",linea1);
  133.                 strcpy(linea1,linea2);
  134.             }
  135.         }
  136.         fprintf(faux2,"%s.",linea1);
  137.         fclose(faux);
  138.         fclose(faux2);
  139.         remove("auxiliar.txt");
  140.         faux = fopen("auxiliar.txt","w");
  141.         faux2 = fopen("auxiliar2.txt","r");
  142.         while(!feof(faux2))
  143.         {
  144.             fscanf(faux2,"%c",&letra);
  145.             if(letra!='.')
  146.                 fprintf(faux,"%c",letra);
  147.         }
  148.         fclose(faux);
  149.         fclose(faux2);
  150.         remove("auxiliar2.txt");
  151.     }
  152. }
  153.  
  154. const char* leelinea(FILE **archivo)
  155. {
  156.     char linea[100]={0}, letra;
  157.     int i=0;
  158.     do
  159.     {
  160.         fscanf(*archivo,"%c",&letra);
  161.         linea[i]=letra;
  162.         i++;
  163.     }
  164.     while(letra!='\n');
  165.     linea[i]='\0';
  166.     return linea;
  167. }
  168.  
  169. int lineas(void)
  170. {
  171.     FILE *faux;
  172.     char letra;
  173.     int lineas=0;
  174.     faux = fopen("auxiliar.txt","r");
  175.     while(!feof(faux))
  176.     {
  177.         fscanf(faux,"%c",&letra);
  178.         if(letra=='\n')
  179.             lineas++;
  180.     }
  181.     return lineas-1;
  182.     fclose(faux);
  183. }

Tambien les dejo como es el archivo "comandos.txt", que realmente puse cosas al azar solo para probarlo.
Código:
ADD 334992 Lopez Loadpez adadsarmo 25 Masculino
ADD 159742 algo super algootro 30 Femenino
ADD 653217 apellido apellido apellido 95 Masculino
ADD 753211 lololol lalala lelele 15 Masculino
ADD 153116 jumdd juddm jummmm 10 Femenino
PRINT file1.txt
ADD 354992 Lopezfmkpez amkmrmo 25 Masculino
ADD 159442 algo super algootro 30 Femenino
print holamundo.txt
SORT
PRINT ordenados.txt
ADD 147821 kmdnba smnf jnbbe mknds 25 Masculino
print noordenados.txt
sort
print ordenados2.txt
ADD 159753 najskdnabfjk ansdkjnajsdm 35 Femenino
ADD 486123 kan abdjand bhyfbkjans sss 56 Masculino
print noordenados2.txt
sort
print superordenados.txt
Como podran ver en el codigo, en la linea 54, puse un printf para asi ver el valor que me regresaba remove("auxiliar.txt")
Y en la linea 150 utilizo un remove("auxiliar2.txt"), y me funciona perfectamente.

Bueno eso es todo, de antemano gracias.

EDIT: Ya encontre mi error, bastante obvio, pero bueno, a veces el error termina siendo super sencillo y no puedes creer que no lo habias visto antes, jaja, bueno, esta en las ultimas lineas, puse un fclose() despues de un return!! entonces cuando llegaba al return terminaba la funcion y jamas llegaba a cerrar el archivo, y este se quedaba abierto, una vez cambiando eso, todo me anduvo perfecto. Gracias a los que leyeron, aunque nadie contesto nada, r.r...

~saludos~

Última edición por omar10594; 07/11/2013 a las 20:03

Etiquetas: char, funcion, int, nombre, programa, string, struct
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:07.