• Sábado 4 de Mayo de 2024, 12:22

Autor Tema:  Pierdo un Caracter Trabajando con ficheros  (Leído 1190 veces)

Rombus

  • Miembro MUY activo
  • ***
  • Mensajes: 105
  • Nacionalidad: ar
    • Ver Perfil
    • http://myspace.com/punkrecycle
Pierdo un Caracter Trabajando con ficheros
« en: Sábado 27 de Septiembre de 2008, 16:07 »
0
Hola gente!

tengo un problema con el siguiente codigo:

Código: Text
  1. #include <stdio.h>
  2. #include <ctype.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5.  
  6. #define PATH "/home/rombus/Escritorio/sample.c"
  7.  
  8. #define FALSE 0
  9. #define TRUE !FALSE
  10.  
  11. #define escribeEnter(a)         fputc('n',a)
  12. #define unoParaAtraz(a)         fseek(a,(long)-1,SEEK_CUR)
  13. #define unoParaAdelante(a)      fseek(a,(long)1,SEEK_CUR)
  14.  
  15. typedef char boolean;
  16.  
  17.  
  18. boolean buscaLlave(FILE *a){
  19.     char c;
  20.    
  21.     do{
  22.         c = fgetc(a);
  23.     }while(c != '{' && c != EOF);
  24.    
  25.     if(c == EOF)
  26.         return FALSE;
  27.     unoParaAtraz(a);
  28.     return TRUE;
  29. }
  30. void limpiaString(char *a){
  31.     int i;
  32.     for(i=0; a[i] != ''; i++)
  33.         a[i] = '';
  34. }
  35. char *getLine(FILE *a){
  36.     char *l = (char*)malloc(255*sizeof(char));
  37.     int i = 0;
  38.    
  39.     do{
  40.         l[i] = fgetc(a);
  41.     }while((l[i] != 'n') && (l[i++] != EOF));
  42.     return l;
  43. }
  44. void escribeTab(FILE *a, int n){
  45.     int i;
  46.    
  47.     for(i=0; i<n; i++)
  48.         fputc('t',a);
  49. }
  50. void indenta(char *path){
  51.     FILE *b = fopen(path,"r+b");
  52.     int cont = 0;
  53.     char *aux = (char *)malloc(sizeof(char)*255);
  54.     long lastLine;
  55.    
  56.    
  57.     while(!feof(b)){
  58.         if(buscaLlave(b)){
  59.             cont++;
  60.             limpiaString(aux);
  61.             aux = getLine(b);
  62.            
  63.             if(strrchr(aux,'}')){
  64.                 cont--;
  65.                 printf("chau...n");
  66.             }
  67.             if(cont){
  68.                 printf("entro en cont mayor a 1n");
  69.                 do{
  70.                     printf("entro en el don");
  71.                     lastLine = ftell(b);
  72.                     limpiaString(aux);
  73.                     aux = getLine(b);
  74.                    
  75.                     if(strrchr(aux,'}')){
  76.                         cont--;
  77.                         printf("cont --n");
  78.                     }
  79.                     fseek(b,lastLine,SEEK_SET);
  80.                     escribeTab(b,cont);
  81.                    
  82.                     if(strrchr(aux,'{'))
  83.                         cont++;
  84.                        
  85.                     aux = getLine(b);
  86.                     if(strrchr(aux,'}')){
  87.                         cont--;
  88.                         printf("cont --n");
  89.                     }
  90.                    
  91.                     printf("cont: %dn",cont);
  92.                 }while(cont > 0 || !feof(b));
  93.             }
  94.         }
  95.         else
  96.             break;
  97.     }
  98.     fclose(b);
  99. }
  100.  
  101. int main(void){ 
  102.     indenta(PATH); 
  103.     printf("Finn");
  104.    
  105.     return 0;
  106. }
  107.  
  108.  


el fichero que lee (el indicado en PATH) es el siguiente:

Código: Text
  1. void indenta(char *path){
  2. FILE *b = fopen(path,"r+b");
  3. int cont = 0;
  4. char *aux = (char *)malloc(sizeof(char)*255);
  5. long lastLine;
  6.  
  7. while(!feof(b)){
  8. if(buscaLlave(b)){
  9. cont++;
  10. limpiaString(aux);
  11. aux = getLine(b);
  12.  
  13. if(strrchr(aux,'}')){
  14. cont--;
  15. printf("chau...n");
  16. }
  17. if(cont){
  18. printf("entro en cont mayor a 1n");
  19. do{
  20. printf("entro en el don");
  21. lastLine = ftell(b);
  22. limpiaString(aux);
  23. aux = getLine(b);
  24.  
  25. if(strrchr(aux,'}')){
  26. cont--;
  27. printf("cont --n");
  28. }
  29. fseek(b,lastLine,SEEK_SET);
  30. escribeTab(b,cont);
  31.  
  32. if(strrchr(aux,'{')){
  33. cont++;
  34. }
  35.  
  36. aux = getLine(b);
  37. if(strrchr(aux,'}')){
  38. cont--;
  39. printf("cont --n");
  40. }                  
  41. printf("cont: %dn",cont);
  42. }while(cont > 0 || !feof(b));
  43. }
  44. }
  45. }
  46. fclose(b);
  47. }
  48.  
  49.  


lo que quiero lograr es que agarre ese codigo sin indentacion y lo indente.. pero estoy perdiendo el primer caracter de cada linea cuando leo una linea y la indento, y no solo es el primero, como que se suman y a veces son dos o a veces no pierdo ningun caracter, pero la funcion de indentar no se efectua...
no puedo descubrir donde esta el error, lo sigo en papel y no lo desifro...


osea, el archivo modificado me queda:

Código: Text
  1. #include <stdio.h>
  2.  
  3. int main(void){
  4.     nt a, b;
  5.     rintf("ingrese a y b: ");
  6.     canf("%d %d",&a,&b);
  7.     if(a > b){
  8.     rintf("no solo a es mayor a b...n");
  9. }
  10. else{
  11. printf("a es mayor a b...n");
  12. }
  13. for(b=0; b<a; b++){
  14. if(b >1){
  15. //linea;
  16. //linea;
  17. }
  18. }
  19. return 0;
  20. }
  21.  
  22.  




uno de mis problema era que no podia depurar en linux (a falta de un IDE completo), encontre el codeBlocks y lo depure...
el error es en la linea 71 con la funcion strrchr();

esto es lo que me dice mi debug:




cuando la cadena AUX vale "tn" como que queda colgado en el strrchr()...

alguien sabe a que se debe esto?, o como resolverlo?

agradesco su ayuda ;)

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Pierdo un Caracter Trabajando con ficheros
« Respuesta #1 en: Lunes 29 de Septiembre de 2008, 15:54 »
0
Es decir, ¿sólo te quita los caracteres iniciales si vienen precedidos de tabulación(es)?

De todas formas, yo lo haría más simple: leería la línea entera y le insertaría las tabulaciones necesarias y volvería a escribir la línea entera, en vez de estar haciendo malabares con el puntero de fichero.

Rombus

  • Miembro MUY activo
  • ***
  • Mensajes: 105
  • Nacionalidad: ar
    • Ver Perfil
    • http://myspace.com/punkrecycle
Re: Pierdo un Caracter Trabajando con ficheros
« Respuesta #2 en: Lunes 29 de Septiembre de 2008, 16:06 »
0
Cita de: "m0skit0"
Es decir, ¿sólo te quita los caracteres iniciales si vienen precedidos de tabulación(es)?
es interesante que lo digas... ya que en teoria mi archivo no tiene tabulaciones :S, pero sin embargo las esta leyendo...

Cita de: "m0skit0"
De todas formas, yo lo haría más simple: leería la línea entera y le insertaría las tabulaciones necesarias y volvería a escribir la línea entera, en vez de estar haciendo malabares con el puntero de fichero.

muy cierto, voy a hacer eso... me esta leyendo los tabuladores que le ingreso cuando no deberia... eso es enredamiento de puntero de fichero XD


me pongo a trabajar :comp: , cuando tenga novedades aviso


gracias  :hola: