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

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Eliminar lineas en Blanco de un TXT
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Eliminar lineas en Blanco de un TXT  (Leído 10,118 veces)
Jupiter34

Desconectado Desconectado

Mensajes: 24


Ver Perfil
Eliminar lineas en Blanco de un TXT
« 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!


En línea

xiruko


Desconectado Desconectado

Mensajes: 438


Ver Perfil
Re: Eliminar lineas en Blanco de un TXT
« Respuesta #1 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!


En línea

Jupiter34

Desconectado Desconectado

Mensajes: 24


Ver Perfil
Re: Eliminar lineas en Blanco de un TXT
« Respuesta #2 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!
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Eliminar lineas en Blanco de un TXT
« Respuesta #3 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
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Jupiter34

Desconectado Desconectado

Mensajes: 24


Ver Perfil
Re: Eliminar lineas en Blanco de un TXT
« Respuesta #4 en: 29 Octubre 2012, 12:09 pm »

Gracias Muchachos! Con esta creo que vamos a andar bien!!! Mil gracias! :rolleyes:
En línea

Jupiter34

Desconectado Desconectado

Mensajes: 24


Ver Perfil
Re: Eliminar lineas en Blanco de un TXT
« Respuesta #5 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
En línea

xiruko


Desconectado Desconectado

Mensajes: 438


Ver Perfil
Re: Eliminar lineas en Blanco de un TXT
« Respuesta #6 en: 29 Octubre 2012, 15:43 pm »

edito: perdonad me he confundido xD si alguien puede borrar el post lo agradeceria
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Eliminar lineas en Blanco de un TXT
« Respuesta #7 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
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Retocar firma + eliminar blanco
Diseño Gráfico
La Muertع Blancα 4 4,739 Último mensaje 29 Mayo 2010, 10:52 am
por La Muertع Blancα
Dejar lineas en blanco hace mas pesado los programas???
Programación C/C++
Anastacio 2 2,305 Último mensaje 21 Enero 2012, 02:52 am
por Anastacio
Eliminar lineas que no cumplan condición
Scripting
Afkael 4 3,203 Último mensaje 2 Junio 2014, 16:28 pm
por Afkael
Eliminar lineas que no cumplan cierta condición
Scripting
Afkael 8 5,197 Último mensaje 4 Febrero 2015, 22:19 pm
por explorer
MOVIDO: Eliminar Items en blanco
Programación General
Eleкtro 0 2,093 Último mensaje 24 Marzo 2018, 22:02 pm
por Eleкtro
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines