Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: ByFuenteS en 14 Febrero 2018, 10:48 am



Título: Ayuda con ejercicio de ficheros C
Publicado por: ByFuenteS en 14 Febrero 2018, 10:48 am
Necesito ayuda con un ejercicio que se basa en quitar los espacios en blancos del principio de un fichero, lo he intentado con este codigo pero en el fichero auxiliar solo me salen ÿ, por todos lados.
#include <stdio.h>
#include <string.h>
#define filelenght
void borrarespacio(FILE *f);

int main() {
   char nombre[filelenght+1];
   FILE *f;
   
   printf("Introduce el nombre del fichero: \n");
   fflush(stdin);
   scanf("%s", nombre);
   
   f=fopen(nombre, "r");
   
   if(f==NULL){
      printf("No se ha podido abrir el fichero. \n");
      return;
   }
   
   borrarespacio(f);
   
   system("pause");
   return 0;
}

void borrarespacio(FILE *f){
   FILE *fborrar;
   char leido;
   fborrar=fopen("borrar.txt", "w");
   leido=fgetc(f);
   
   
   while(!feof(f)){
      if(leido==' '){
         fputc('\0',fborrar);
      }
      else{
         fputc(leido,fborrar);
         while(leido!='\n'){
            leido=fgetc(f);
            fputc(leido,fborrar);
         }   
      }
      leido=fgetc(f);
   }
}

Alguien me podria ayudar con este codigo y a poder ser también con la busqueda de una palabra que aparece varias veces en mi código y necesito indicar la linea y la posicion en la que aparece. Muchas gracias!!!


Título: Re: Ayuda con ejercicio de ficheros C
Publicado por: MAFUS en 14 Febrero 2018, 12:08 pm
No pongas '\0' cuando encuentres un espacio.
Lee línea a línea. Busca el primer carácter no espacio al principio desde el principio. Cuando lo encuentres toma ese puntero y lo usas como si fuera una cadena a escribir en el archivo.

Algo así:
Código
  1. #include <stdio.h>
  2.  
  3. char* eliminarEspaciosIniciales(char* cadena) {
  4.    while(*cadena == ' ') ++cadena;
  5.    return cadena;
  6. }
  7.  
  8. int main () {
  9.    char *cadena = "   Soy una cadena";
  10.  
  11.    puts("Original:");
  12.    printf("%s", cadena);
  13.  
  14.    puts("\n");
  15.  
  16.    puts("Sin espacios al incio:");
  17.    printf("%s", eliminarEspaciosIniciales(cadena));
  18.  
  19.    puts("\n");
  20. }

Solo debes cambiar la cadena estática por una conseguida a través del archivo y el printf por un fprintf al archivo nuevo.


Título: Re: Ayuda con ejercicio de ficheros C
Publicado por: dijsktra en 16 Febrero 2018, 14:59 pm
A ver, no se si tiene mucho interes quitar los espacios del principio del fichero, pero yo contribuyo a resolver la ultima parte del mensaje

[...]
Alguien me podria ayudar con este codigo y a poder ser también con la busqueda de una palabra que aparece varias veces en mi código y necesito indicar la linea y la posicion en la que aparece. Muchas gracias!!!

Primero el ejemplo de ejecución: buscar "en el código" (o cualquier fichero de texto en general) las apariciones de una palabra "perror" (o cualquier palabra) indicando linea y columna.

Entrada

Código:
searchWord.c perror

(Creo que la segunda falla, porque el editor emacs que uso mete \t para dar formato al texto C...pero ya no sigo a corregirlo.)

Salida
Código:
45:6	perror
53:3 perror
80:6 perror

Y ahora el código... Se trata del algoritmo más trivial de este estilo, con una complejidad theta(N*M), siendo N el numero de caracteres del archivo y M la longitud (mayor que 0) del patron a buscar. (Está claro que los google engines nunca utilizarán este algoritmo  ;D)


Código
  1. /*
  2.   Naive string matching on file .
  3.   Theta(N*M) ,
  4.   N (length of contents)
  5.   M (length of pattern)
  6. */
  7.  
  8. #include <stdio.h>
  9. #include <errno.h>
  10. #include <stdlib.h>
  11. #include <assert.h>
  12.  
  13. #include <string.h>
  14.  
  15.  
  16. /*
  17.  
  18.  I : lineno = #i : 0 <= i <= n : V[i]='\n'
  19.      column = max p : 0<= p <= n and AllesNotRet(V,p,n)   : n-p
  20.      buf[0..min(n,m))=V[max(n-m,0),n)
  21.  
  22.   Invariant snapshot
  23.  
  24. 0                                        n=7
  25. +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
  26. |  a  |  b  |  c  | \n  |  s  |  e  |  r  |  a  |     |     |
  27. +-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
  28.  
  29.               buf= "\nser"
  30.      lineno=1
  31.      colum=3
  32.      pattern=sera
  33.      m = 4
  34. */
  35.  
  36.  
  37. // IO
  38. void searchPattern(FILE *f, const char pattern[])
  39. {
  40.  int n,lineno,column;
  41.  const int m = strlen(pattern);
  42.  char *buf ;
  43.  if (!(buf=(char *)calloc(m,sizeof(char))))
  44.    {
  45.      perror("calloc");
  46.      exit(EXIT_FAILURE);
  47.    }
  48.  for(lineno=column=n=0 ; !feof(f) ; n++)
  49.    {
  50.      char chr=fgetc(f);
  51.      if (ferror(f))
  52. {
  53.  perror("fgetc");
  54.  exit(EXIT_FAILURE);
  55. }
  56.      int i;
  57.      for(i=0; i<m-1 ; i++) buf[i]=buf[i+1]; // shift window
  58.      buf[m-1]=chr;
  59.      if (strncmp(buf,pattern,m)==0)
  60. printf("%d:%d\t%s\n",lineno+1,column-m+1,pattern);
  61.      lineno += (chr=='\n');
  62.      column =  (chr =='\n')?0:(column+1);
  63.    }
  64.  free(buf);
  65.  return;
  66. }
  67.  
  68.  
  69. int main (void)
  70. {
  71.  FILE *f;
  72.  int n,N;
  73.  
  74. #define MAX 10000
  75.  char path[MAX];
  76.  char word[MAX];
  77.  scanf("%s %s",path,word);
  78.  if (!(f = fopen(path,"r")))
  79.    {
  80.      perror("fopen");
  81.      exit(EXIT_FAILURE);
  82.    };
  83.  searchPattern(f,word);
  84.  fclose(f);
  85.  return 0;
  86. }
  87.  
  88. /*
  89. Note : Formal Specification is done referring to V[0..N)/(POS[0..P))
  90.        instead of file stream (f)/(stdin)
  91.        
  92. P : M > 0
  93. Q : P = #i : 0 <= i < N : buf[0..m)=V[i,min(i+m,N))
  94.     \forall i : 0 <= i < P : V[POS[i]..POS[i]+m)=pattern[0..m)
  95.                              V[POS[i]-COLUMN[i]-1]=\n and
  96.                              LINE[i]=#i : 0 <= i < POS[i] : V[i]=\n
  97. */                          
  98.  
  99.  
  100.