Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Jupiter34 en 27 Octubre 2012, 23:26 pm



Título: Eliminar lineas en Blanco de un TXT
Publicado por: Jupiter34 en 27 Octubre 2012, 23:26 pm
Estuve leyendo, pero parece que no hay una función en C que me permita eliminar las lineas en blanco de un archivo de texto. He leído, que es necesario crear, un nuevo archivo para después renombrarlo....

Realice ese código, pero no logro dar con la tecla....

Código:
FILE *cfptr;
    char linea[10000];
    int i, numLin=0;
    char *sep=";";
    char *ptr;
    char *ptr_id;
    char *ptr_nom;
    //Borro lo que este!
    remove("E:\\dataout.txt");
    //Reviso las Lineas
    if ((cfptr=fopen("E:\\categorias.txt","r"))==NULL){
        printf("\n No se puede Abrir!");
    }else{
        FILE * temp = fopen( "E:\\dataout.txt", "wt");
        while (fgets (&linea, 10000, cfptr)!=NULL){
                //Si no hay mas Que leer, salgo del ciclo!
                if (i=fgetc(cfptr)==EOF){
                    break;
                }else{
                    ungetc(i,cfptr);
                    numLin++; //Cuento de Chusma
                    fputs(linea, temp); //Agrego la Linea, al Archivo Temporal!
                }
        }
        fclose(temp);
    }
    fclose(cfptr);
    system("PAUSE");

Te aclaro que categorias.txt esta formado;

0;Televisor
1;Radio
2;Microondas
3;Video

Quiero levantarlo, y que quede asi...

Hay veces, que puede venir por ej...

0;Televisor


1;Radio
2;Microondas

3;Video


La idea, es ... que si tengo que levantar un archivo que tenga espacios en blancos, entre los registros, limpiarlo y dejarlo consistente!

En lo que me puedan dar una mano, mil gracias! Como siempre!


Título: Re: Eliminar lineas en Blanco de un TXT
Publicado por: xiruko en 28 Octubre 2012, 00:56 am
vengo de estar leyendo un rato un codigo bastante denso y me da pereza leer el tuyo y encontrar donde falla... te dejo un codigo que funciona, es algo diferente al tuyo ya que yo por ejemplo leo caracter por caracter llevando la cuenta de los saltos de linea seguidos que se va encontrando, pero bueno te lo dejo por si te interesa mirartelo y sacar alguna idea.

Código
  1. #include <stdio.h>
  2.  
  3. int main(int argc, char** argv) {
  4.  
  5. if (argc != 2) {
  6. printf("MODO DE USO: %s <archivo>\n", argv[0]);
  7. return 0;
  8. }
  9.  
  10. FILE *f1=fopen(argv[1], "r");
  11. FILE *f2=fopen("temp.txt", "w");
  12. int bytesLeidos, contador=0; // contador dice el numero de '\n' seguidos que encuentra
  13. char aux;
  14.  
  15. while (1)
  16. {
  17. bytesLeidos=fread(&aux, sizeof(char), 1, f1);
  18.  
  19. if (bytesLeidos > 0) {
  20.  
  21. contador= (aux=='\n') ? contador+1 : 0;
  22.  
  23. // se escribe solo si el caracter es distinto de '\n' o si es el primer
  24. // '\n' que encuentra
  25. if (contador==1 || aux!='\n') fwrite(&aux, sizeof(char), 1, f2);
  26.  
  27. } else break;
  28. }
  29.  
  30. printf("Proceso completado.\n");
  31. fclose(f1);
  32. fclose(f2);
  33.  
  34. remove(argv[1]);
  35. rename("temp.txt", argv[1]);
  36.  
  37. return 0;
  38. }

Código:
xiruko:~$ cat archivo.txt 
0;Televisor



1;Radio

2;Microondas
3;Video


4;Movil
xiruko:~$ gcc texto.c -o texto
xiruko:~$ ./texto archivo.txt
Proceso completado.
xiruko:~$ cat archivo.txt
0;Televisor
1;Radio
2;Microondas
3;Video
4;Movil
xiruko:~$

un saludo!


Título: Re: Eliminar lineas en Blanco de un TXT
Publicado por: Jupiter34 en 28 Octubre 2012, 01:09 am
No estoy tan ducho! Para leer codigo! Pero se agradece!!!

Voy a investigarlo!

Imagine que pensarlo de esa manera, era mas facil!

Seguire leyendo!


Título: Re: Eliminar lineas en Blanco de un TXT
Publicado por: rir3760 en 29 Octubre 2012, 08:12 am
Otra opción consiste en el uso de las funciones "fgetc" y "fputc" (prototipos en <stdio.h>), mas o menos así:
Código
  1. int ch;
  2. int prev;
  3.  
  4. /* ... */
  5.  
  6. prev = '\n';
  7. while ((ch = fgetc(entrada)) != EOF)
  8.   if (prev != '\n' || ch != '\n'){
  9.      fputc(ch, salida);
  10.      prev = ch;
  11.   }

Un saludo


Título: Re: Eliminar lineas en Blanco de un TXT
Publicado por: Jupiter34 en 29 Octubre 2012, 12:09 pm
Gracias Muchachos! Con esta creo que vamos a andar bien!!! Mil gracias! :rolleyes:


Título: Re: Eliminar lineas en Blanco de un TXT
Publicado por: Jupiter34 en 29 Octubre 2012, 14:22 pm
Algo estoy haciendo mal...

Código:
//Grabo Categorias
void grabaCategorias(nodocat *lista){

    nodocat *puntero;

    puntero=lista;

    FILE *cfptr, *temp;

    if ((cfptr=fopen("E:\\categorias.txt","w"))==NULL){
        printf("\n No se puede Abrir!");
    }else{
        while(puntero!=NULL){
            fprintf(cfptr,"%d;%s",puntero->id,puntero->nomCat);
            fprintf(cfptr,"\n");
            puntero=puntero->sig;
        }
        //fclose(cfptr);
        printf("Se Han Grabado los Datos de Usuario Correctamente\n\n");
    }
    if ((cfptr=fopen("E:\\temp.txt","w"))==NULL){
        printf("\n No se puede Abrir!");
    }else{
        int ch;
        int prev;
        prev='\n';
        while ((ch = fgetc(cfptr)) != EOF){
            if (prev != '\n' || ch != '\n'){
            fputc(ch, temp);
            prev = ch;
            }
        }
    }
    fclose(cfptr);
    fclose(temp);
}

La idea, es que despues de grabar lea el archivo y elimine los reglones en blanco...

No logro ingresar al while que va hasta el End Of File...

La idea es limpiar, copiando a temp.txt para luego eliminar categorias.txt y reemplazando por temp.txt...

Saludos


Título: Re: Eliminar lineas en Blanco de un TXT
Publicado por: xiruko en 29 Octubre 2012, 15:43 pm
edito: perdonad me he confundido xD si alguien puede borrar el post lo agradeceria


Título: Re: Eliminar lineas en Blanco de un TXT
Publicado por: rir3760 en 29 Octubre 2012, 17:02 pm
Problemas hay varios, el mas importante es el modo de apertura de los archivos: el archivo de entrada se debe abrir en el modo "rt" y el de salida en "wt".

También se debe generar el mensaje de error de forma automática (mediante la función "perror") y utilizar nombres descriptivos para las variables.

La función con las correcciones:
Código
  1. void grabaCategorias(nodocat *p)
  2. {
  3.   FILE *entrada;
  4.   FILE *salida;
  5.  
  6.   if ((salida = fopen("E:\\temp.txt", "w")) == NULL){
  7.      perror("E:\\temp.txt");
  8.      return;
  9.   }
  10.   while (p != NULL){
  11.      fprintf(salida, "%d;%s\n", p->id, p->nomCat);
  12.      p = p->sig;
  13.   }
  14.   fclose(salida);
  15.  
  16.   if ((entrada = fopen("E:\\temp.txt", "r")) == NULL)
  17.      perror("E:\\temp.txt");
  18.   else if ((salida = fopen("E:\\categorias.txt", "w")) == NULL){
  19.      perror("E:\\categorias.txt");
  20.      fclose(entrada);
  21.   }else {
  22.      int ch;
  23.      int prev;
  24.  
  25.      prev = '\n';
  26.      while ((ch = fgetc(entrada)) != EOF)
  27.         if (prev != '\n' || ch != '\n'){
  28.            fputc(ch, salida);
  29.            prev = ch;
  30.         }
  31.  
  32.      fclose(entrada);
  33.      fclose(salida);
  34.   }
  35. }

Un saludo