Consultas, desarrollo de programas y petición de presupuestos:

jueves, 12 de julio de 2012

Problemas: crear un comando similar al cat y buscar una palabra dentro del archivo.

Hacernos nuestro propio comando cat. ¿que es lo que hace cat?: unir archivos y te muestra el resultado en la salida estandard. Queremos que nos enseñe el contenido del archivo.
#include <stdio.h>
#include <string.h>


int main(int argc, char **argv)
{
// Tarea: crear un comando nos muestre el contenido de un archivo
int c=1;
// repetir tantas veces como nº de argumentos-1 haya (para ver mas de un archivo)
char caracter;
FILE *pf;
while (c<argc){
    // leo el argumento (nº2,n=1, para leer el archivo que queremos que nos muestre
   // abrir el archivo
   if ((pf=fopen(argv[c],"r"))==NULL){
       printf("no exise el archivo: %s",argv[c]);
       //break;
    } else {
   // empiezo a leerlo hasta que termine
   while(!feof(pf)){
    // leer cada linea con fscanf
   // mostrar contenido con prinf
   fscanf(pf,"%c",&caracter);
   printf("%c", caracter);
   }
   // cerrar el archivo
   fclose(pf); // cierrro el archivo
  }
c++;
}
printf("***************** Fin del programa ************ \n");
return 0;
}



2º problema:
Hacer un programa que admita dos argumentos: el 1º una palabra a buscar y el 2º un nombre de archivo. La respuesta del programa debe de ser la cantidad de veces que aparezca la palabra en el archivo.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#define FALSE 0
#define TRUE !FALSE

int busca(char *, char *); // palabra y fichero

int main(int argc, char **argv)
{
// Tarea: buscar cuantas veces se repite una palabra en un archivo

int c=0;
char caracter;
char textofichero[23000];

FILE *pf;

    // leo el argumento (el argumento 0 es la nombre del programa)

    // leo el argumento (el argumento 1 es la palabra a buscar)

    // leo el argumento (el argumento 2 es el nombre del archivo)

   // abrir el archivo

   if ((pf=fopen(argv[2],"r"))==NULL){

       printf("no exise el archivo: %s",argv[2]);

       //break;

    } else {

   // empiezo a leerlo hasta que termine
   c=0;
   while(!feof(pf)){

   fscanf(pf,"%c",&caracter);

   textofichero[c]=caracter;
    c++;
   }
   textofichero[c]='\0';
printf("%s",textofichero);
   // cerrar el archivo

   fclose(pf); // cierrro el archivo
 
   // buscar la palabra que esta el el argumento nº 1, en el texto
  printf("Numero de veces que se repite: %d \n", busca(argv[1],textofichero));
 
 
}


printf("***************** Fin del programa ************ \n");

return 0;

}


//funcion de busqueda de una palabra en un texto largo:


int busca(char *palabra1,char *textoarchivo)
{
    int tamP1;
    int tamP2;
    int c2 = 0;
    int posicion = 0;
    int despla = 0;
    int encontrado = FALSE;
    int veces; // numero de veces que encuentra la palabra
    veces=0;
    // Comprobaciones previas
  
  
    tamP1 = strlen(palabra1);
    tamP2 = strlen(textoarchivo);
    // Si palabra1 es más larga que palabra2, es imposible que esté contenida en palabra2
    if(strlen(palabra1) > strlen(textoarchivo)) {
        return 0;
    }
  
    // Mientras en palabra2 queden suficientes letras para que pueda contener palabra1
    // Busca la primera letra de palabra 1 en palabra 2
    for(c2 = 0; c2 <= tamP2 -tamP1 && !encontrado; c2++) {
        // Coincide la primera letra de palabra1
        if(palabra1[0] == textoarchivo[c2]) {
            // Busca el resto de las letras de palabra 1 a partir de donde se encontró la primera en palabra2
            for(despla = 0; palabra1[despla] == textoarchivo[c2 + despla] && palabra1[despla] != '\0'; despla++) {
               
            }
            // Si despla llega a tamP1 indica que se a recorrido palabra1 por completo y coincide
            if(despla == tamP1) {
                posicion = c2;
                encontrado = TRUE;
            }
        }
        if(encontrado) {
        printf("%d\n", posicion); // Muestro la posicion donde esta
        veces++; //Voy contando cuantas veces pararece
        encontrado=FALSE;
    }
       
  
    }
    return veces;
}

No hay comentarios:

Publicar un comentario