Eliminar lineas en Blanco de un TXT

Iniciado por Jupiter34, 27 Octubre 2012, 23:26 PM

0 Miembros y 1 Visitante están viendo este tema.

Jupiter34

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....

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!

xiruko

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.

#include <stdio.h>

int main(int argc, char** argv) {

if (argc != 2) {
printf("MODO DE USO: %s <archivo>\n", argv[0]);
return 0;
}

FILE *f1=fopen(argv[1], "r");
FILE *f2=fopen("temp.txt", "w");
int bytesLeidos, contador=0; // contador dice el numero de '\n' seguidos que encuentra
char aux;

while (1)
{
bytesLeidos=fread(&aux, sizeof(char), 1, f1);

if (bytesLeidos > 0) {

contador= (aux=='\n') ? contador+1 : 0;

// se escribe solo si el caracter es distinto de '\n' o si es el primer
// '\n' que encuentra
if (contador==1 || aux!='\n') fwrite(&aux, sizeof(char), 1, f2);

} else break;
}

printf("Proceso completado.\n");
fclose(f1);
fclose(f2);

remove(argv[1]);
rename("temp.txt", argv[1]);

return 0;
}


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!

Jupiter34

No estoy tan ducho! Para leer codigo! Pero se agradece!!!

Voy a investigarlo!

Imagine que pensarlo de esa manera, era mas facil!

Seguire leyendo!

rir3760

Otra opción consiste en el uso de las funciones "fgetc" y "fputc" (prototipos en <stdio.h>), mas o menos así:
int ch;
int prev;

/* ... */

prev = '\n';
while ((ch = fgetc(entrada)) != EOF)
   if (prev != '\n' || ch != '\n'){
      fputc(ch, salida);
      prev = ch;
   }


Un saludo
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

Gracias Muchachos! Con esta creo que vamos a andar bien!!! Mil gracias! :rolleyes:

Jupiter34

Algo estoy haciendo mal...

//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

xiruko

edito: perdonad me he confundido xD si alguien puede borrar el post lo agradeceria

rir3760

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:
void grabaCategorias(nodocat *p)
{
   FILE *entrada;
   FILE *salida;
   
   if ((salida = fopen("E:\\temp.txt", "w")) == NULL){
      perror("E:\\temp.txt");
      return;
   }
   while (p != NULL){
      fprintf(salida, "%d;%s\n", p->id, p->nomCat);
      p = p->sig;
   }
   fclose(salida);
   
   if ((entrada = fopen("E:\\temp.txt", "r")) == NULL)
      perror("E:\\temp.txt");
   else if ((salida = fopen("E:\\categorias.txt", "w")) == NULL){
      perror("E:\\categorias.txt");
      fclose(entrada);
   }else {
      int ch;
      int prev;
     
      prev = '\n';
      while ((ch = fgetc(entrada)) != EOF)
         if (prev != '\n' || ch != '\n'){
            fputc(ch, salida);
            prev = ch;
         }
     
      fclose(entrada);
      fclose(salida);
   }
}


Un saludo
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