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

 

 


Tema destacado: Tutorial básico de Quickjs


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ayuda con ejercicio de ficheros C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda con ejercicio de ficheros C  (Leído 2,784 veces)
ByFuenteS

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Ayuda con ejercicio de ficheros C
« 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!!!


En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Ayuda con ejercicio de ficheros C
« Respuesta #1 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.


« Última modificación: 15 Febrero 2018, 15:33 pm por MAFUS » En línea

dijsktra

Desconectado Desconectado

Mensajes: 110


Mr Edsger Dijsktra (Tribute to)


Ver Perfil
Re: Ayuda con ejercicio de ficheros C
« Respuesta #2 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.  




« Última modificación: 16 Febrero 2018, 17:24 pm por dijsktra » En línea

Si la depuración es el proceso de eliminar fallos en el software, entonces programar debe ser el proceso de ponerlos dentro. (Edsger Dijsktra)
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ejercicio C manejo de ficheros
Programación C/C++
Gr1nD3r 3 4,760 Último mensaje 26 Julio 2010, 07:28 am
por do-while
Problema en ejercicio de ficheros
Programación C/C++
DickGumshoe 5 3,520 Último mensaje 5 Febrero 2012, 15:50 pm
por DickGumshoe
un ejercicio de ficheros en c
Programación C/C++
Palante 3 2,492 Último mensaje 4 Junio 2017, 07:52 am
por MAFUS
EJERCICIO programacion en C. FICHEROS
Programación C/C++
Pinkfloyero 3 2,494 Último mensaje 2 Febrero 2018, 13:21 pm
por dijsktra
[Java] Ayuda con ejercicio sobre ficheros
Ejercicios
emodad 1 2,800 Último mensaje 7 Marzo 2022, 23:05 pm
por .xAk.
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines