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

[SOLUCIONADO] Error al eliminar fichero 0 bytes

Estas en el tema de Error al eliminar fichero 0 bytes en el foro de C/C++ en Foros del Web. Hola a todos a los del foros del web, estoy empezando a programar en c, y estoy aprendiendo sobre los archivos sin embargo tengo un ...
  #1 (permalink)  
Antiguo 18/04/2014, 10:40
 
Fecha de Ingreso: junio-2009
Ubicación: House
Mensajes: 38
Antigüedad: 14 años, 10 meses
Puntos: 1
Error al eliminar fichero 0 bytes

Hola a todos a los del foros del web, estoy empezando a programar en c, y estoy aprendiendo sobre los archivos sin embargo tengo un pequeño problema quisiera hacer una aplicación que elimine un archivo si contiene 0 bytes he intentado hacer un código pero no conseguí lograrlo si podrían darme ideas de como resolverlo se los agradecería, dejo el código saludos.

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main()
  5. {
  6.  
  7. FILE *test;
  8.  
  9.    
  10.     if( (test=fopen("p.txt","ab")) == NULL)
  11.     {
  12.     puts("Error");
  13.     }
  14.     else
  15.     {
  16.     puts("Fichero fue abierto correctamente");
  17.     }
  18.     fclose(test);
  19.    
  20. if( (test=fopen("p.txt","rb")) == NULL)
  21.     {
  22.         puts("Se eliminara fichero de 0 bytes");
  23.         fclose(test);
  24.         remove("p.txt");
  25.         exit(1);
  26.     }
  27.     else
  28.     {
  29.         puts("El fichero esta abierto en modo de lectura");
  30.     }
  31. fclose(test);
  32. return 0;
  33. }

Última edición por RaKKoS; 18/04/2014 a las 11:43
  #2 (permalink)  
Antiguo 18/04/2014, 12:00
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Error al eliminar fichero 0 bytes

Puedes recuperar el tamaño del archivo y comprovar lo que ocupa:

Código C:
Ver original
  1. FILE *arx;
  2. size_t fs;
  3.  
  4. //abres manejador
  5. if(!(arx = fopen(ruta, "r"))) {
  6.     //error de acceso
  7. }
  8. else {
  9.     //mueves el puntero al final
  10.     fseek(arx, 0L, SEEK_END);
  11.    
  12.     //obtienes posicion del puntero (posicion final = tamaño)
  13.     if(ftell(arx) == 0) {
  14.         //archivo de 0 bytes, cierras y eliminas
  15.         fclose(arx);
  16.         if(remove(ruta)) {
  17.             //error en eliminar
  18.         }
  19.         else {
  20.             //archivo eliminado
  21.         }
  22.     }
  23.     else {
  24.         //restauras puntero
  25.         fseek(arx, 0L, SEEK_SET);
  26.        
  27.         //ahora puedes trabajar con el archivo, al final lo cierras
  28.         fclose(arx);
  29.     }
  30. }


Espero que te sirva
Saludos
vosk
  #3 (permalink)  
Antiguo 18/04/2014, 12:13
 
Fecha de Ingreso: junio-2009
Ubicación: House
Mensajes: 38
Antigüedad: 14 años, 10 meses
Puntos: 1
Respuesta: Error al eliminar fichero 0 bytes

Hola vosk gracias por tu pronta repuesta, efectivamente si realiza el proceso que quiero, sin embargo tengo una pregunta en la línea 2 el
Código C:
Ver original
  1. 2.size_t fs;
que efecto hace sobre el código ?, además del segundo argumento de la línea 25
Código C:
Ver original
  1. 25.        fseek(  0L
, tendré que leer mas sobre los indicadores de posición de flujo .
  #4 (permalink)  
Antiguo 18/04/2014, 13:16
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Error al eliminar fichero 0 bytes

El size_t fs es un fallo mio, primero queria ponerte como recuperar el tamaño en una variable y despues comprovar la variable

Código C:
Ver original
  1. size_t fs;
  2. fs = fseek(arx);
  3. if(fs == 0) {
  4.     ...
  5. }

Pero al final opté por comprovar directamente el retorno y olvidé quitar la variable, es decir que en este caso no hace nada. Disculpa este despiste :)

El segundo argumento de fseek es el offset al que va a moverse el puntero desde la posicion que se le indica; por ejemplo SEEK_SET indica que se situe al inicio, si le doy un offset de 3 se situará al byte 3 contando desde el principio. Si estuviese en medio del archivo y le digo que se mueva a SEEK_CUR con un offset de 0 no movera el puntero , pero si le digo SEEK_CUR con un offset de 5 avanzará 5 bytes desde la posicion actual (cualquiera que sea). La L sirve para notar que me refiero a un valor de tipo long, puedes omitirla. O si por ejemplo quieres moverte a la ultima posicion del archivo le dices que salte a SEEK_END con un offset de -1, movera el puntero al final del archivo y luego retrocederá 1 byte.

Saludos
vosk
  #5 (permalink)  
Antiguo 18/04/2014, 13:32
 
Fecha de Ingreso: junio-2009
Ubicación: House
Mensajes: 38
Antigüedad: 14 años, 10 meses
Puntos: 1
Respuesta: Error al eliminar fichero 0 bytes

Wuaow, vosk gracias por tu repuesta he despejado dudas además de entender mejor como trabajan la posición de los archivos es decir teniendo en cuenta lo que tu dices si colocara este código
Código C:
Ver original
  1. fseek(test,-1,SEEK_END)==0)
me estuviese situando en el penúltimo byte del archivo no?, por otro lado ya realice el código que deseaba, quedo a si, gracias nuevamente por tu ayuda

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4.  
  5. int main()
  6. {
  7.  
  8. FILE *test;
  9.  
  10.    
  11.     if( (test=fopen("eliminar.txt","ab")) == NULL)
  12.     {
  13.     puts("Error");
  14.     }
  15.     else
  16.     {
  17.     puts("Fichero fue abierto correctamente");
  18.     }
  19.     fclose(test);
  20.     printf("Pulse una tecla para continuar");
  21.     getch();
  22.    
  23. if( (test=fopen("eliminar.txt","r")) == NULL)
  24.     {
  25.         puts("Error");
  26.         exit(1);
  27.     }
  28.     else
  29.     {
  30.         puts("El fichero esta abierto en modo de lectura");
  31.    
  32.    
  33.     if (fseek(test,0,SEEK_END)==0)
  34.     {
  35.     puts("Se movio el puntero al final del archivo");
  36.     }
  37.    
  38.     if(ftell(test)==0)
  39.     {
  40.     puts("Se removera fichero de 0 bytes");
  41.     fclose(test);
  42.     remove("eliminar.txt");
  43.     }
  44.     else
  45.     {
  46.     printf("No se eliminara fichero debido a que posee %ld bytes",ftell(test));
  47.     }
  48. }
  49.    
  50. fclose(test);
  51. return 0;
  52. }

Etiquetas: fichero, int, programa
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 12:43.