buscar en un fichero c++

Iniciado por br7, 21 Noviembre 2013, 00:55 AM

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

br7

estoy haciendo un progrma q buscar palabras en fichero
pero necesito ayuda con este codigo
lo q necesito es q busqua q lo guarde en un fichero nuevo q creo con el nombre de la palabra q ingreso
ejemplo
primero te pide el nombre del fichero mifichero.txt  el deve estar en donde esta el programas
y despues podide q ingrese la palabra a buscar por ejemplo ingreso en
la buscar y muestra en donde esta y cuantas hay pero lo q buscar quiero q lo guarde en el fichero q creo  con la palabra en solo necesito como es para q yo puede guardar el resultado en ese fichero nuevo


char texto[100000000],arch[1000],letras[100];
int n,sum=0;
int contador = 0, encontrado = 0;
char cadena[256], buscar[100],nombre[25],buscrear[50];
char *a;
FILE *f,*crear;

main()
{
   printf("Ingrese el nombre del archivo del block de notas: ");

f = fopen(gets(arch),"r");
   if(f==NULL)
   {
   perror ("Error al abrir archivo");
   return -1;
   }
printf("\nEL CONTENIDO DEL FICHERO ES :\n\n");
while (fgets(texto,100000000,f) != NULL)
{
   cout<<texto;
}
    if (f != NULL)
    {
            printf("\nIngrese la palabra/frase que desea buscar en el archivo %s:\n\n\t\t\t\t", nombre);
            fflush(stdin);        //limpiar
            scanf("%[^\n]", buscar);
            //scanf("%[^\n]");

            strcpy(buscrear, buscar);  //copia la cadena

            strcat(buscrear,".txt");           //crear archivos
            crear=fopen(buscrear,"a+w");

            rewind(f);     //reguesar

            contador = 0;

            encontrado = 0;

            while (!feof(f))  //retorna diferente de 0
            {
                contador++;

                fgets(cadena,256,f);

                a = strtok(cadena,",.- ");

                while (a != NULL)
                {
                    if (!strcmp(buscar, a))      //comprar
                    {
                       encontrado++;
                     if(encontrado==1)
                     {
                     printf("%s Linea ",a);
                        } //if

                     printf("%d ", contador);

                    }//if
                    a = strtok (NULL, " ");
                }//while   2
            }//while 1
             if(encontrado>=1)
                   {
                   printf(",apareciones total :%d", encontrado);
                   }
                   //arch2.close();
            if (encontrado <= 0)
            {
            printf("\nLa palabra o frase no se encontro en el archivo %s.\n", nombre);
             }
     }
        fclose(crear);
        fclose(f);
getchar();  getchar();
  }

gracias

rir3760

* En buen plan lo primero que debes hacer es mejorar tu ortografía, si no entendemos el mensaje no es posible ayudar a resolver el problema.

* Cuando publiques código fuente por favor utiliza las etiquetas de código. Estas se agregan mediante el cuadro desplegable con el texto "GeSHi" en la pagina de composición de mensajes, solo tienes que seleccionar ahí el lenguaje (C, C++, etc.).

* No utilices la función gets como tampoco fflush(stdin). Mas información en la pagina |Lo que no hay que hacer en C/C++. Nivel basico|

----

En C++ puedes utilizar la clase string y la funcion getline para leer cada una de las lineas de texto que componen un archivo.

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

Vaagish

Citary despues podide q ingrese la palabra a buscar por ejemplo ingreso en
la buscar y muestra en donde esta y cuantas hay pero lo q buscar quiero

Wow! Quiero pensar que su lengua nativa no es el español.

br7

comprendo
pero tengo otro problema
como vacio una varriable tipo char en  c++
tengo una variable tipo char dentro de un for que cada vez que corre le pide al usuario que ingrese una palabra y  cada vez que el for corre el usuario ingresa una palabra distinta, digamos el programa pide cuantas palabras quiere ingresar el usuario dice 4 el for va a corre 4 veces y cada vez que pide la palabra el usuario tiene que ingresar una palabra distinta que la anterior pero yo la quiero capturar en la misma variable

como hago eso?
que cada vez que corra capture una palabra diferente pero en la misma variable
dice que poniendo ==NULL pero no funcio y otro dice que coloque que es igual a ='\0'
pero no funciona nose como hacerlo

gracias de antemano

Código (cpp) [Seleccionar]


char texto[100000000],arch[1000],letras[100];
int d;
char buscar[100],nombre[25],buscrear[50];
FILE *f;
ofstream entrada;

main()
{
cout<<"Ingrese el nombre del archivo del block de notas con extension .txt: \n";

f = fopen(gets(arch),"r");
if(f==NULL)
{
perror("Error al abrir archivo");
return -1;
}
cout<<"\nEL CONTENIDO DEL FICHERO ES :\n\n";
while (fgets(texto,100000000,f) != NULL)
{
cout<<texto;
}
    if (f != NULL)
    {
    cout<<"\n\ncuantas palabras va a buscar\n\n ";
    cin>>d;

          for(int c=1;c<=d;c++)
            {
             buscar[c] ='\0';  /*YO PIESNO QUE AQUI ESTA EL PROBLEMA
              YO QUIERO QUE SE VACIE PARA VOLVER A
                                 LLENARLA ABAJO CON OTRA FASE  PERO NO SE
                                  COMO SE HACER  */
            printf("\n\nIngrese la palabra/frase que desea buscar en el archivo %s:\n\n\t\t\t\t",nombre);
            fflush(stdin);
            scanf("%[^\n]",buscar);

            strcpy(buscrear, buscar);

            strcat(buscrear,".txt");

            entrada.open(buscrear,ios::out);

            if(entrada==NULL)
{
    perror("Error al abrir archivo");
    return -1;
}


            if(entrada!=NULL)
{
    cout<<"\nArchivo creado con exito";
}
           }
      }



fclose(f);
getchar();  getchar();
}






Vaagish

En este preciso momento, recien llegue del trabajo,, se me ocurre strcpy( buscar[c], " " ) ; o con memset, mañana te doy una mejor ayuda..

Saludos!

rir3760

El programa hay que rescribirlo desde cero ya que de C++ tiene bien poco, casi todo es C. Y como ya te comente no debes utilizar gets como tampoco fflush(stdin), por favor lee la pagina |Lo que no hay que hacer en C/C++. Nivel basico|

No necesitas "vaciar" una variable, solo tienes que utilizar un objeto de la clase string para leer ahí la palabra verificando que la lectura fue exitosa, nada mas. Por ejemplo:
Código (cpp) [Seleccionar]
#include <iostream>
using std::cin;
using std::cout;
using std::endl;

#include <string>
using std::string;

int main()
{
   cout << "Cuantas palabras? ";
   int num_pals;
   cin >> num_pals;
   
   for (int i = 0; i != num_pals; ++i){
      cout << "Teclea la palabra: ";
      string palabra;
      if (cin >> palabra)
         cout << "La palabra " << (i + 1) << " es " << palabra << endl;
      else
         break;
   }
   
   return 0;
}


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

Vaagish

En realidad no me había detenido a leer el código, y mucho menos la consigna (costaba entender bastante)
Sigue los consejos de rir3760, esta mucho mas limpio ese código.

Saludos!

br7

Gracias me ayudo vastan lo que decia rir3760

rir3760

@br7: las recomendaciones sobre libros, por desgracia todos ellos en ingles, se encuentran en el tema Presentación y dudas .

Otra opción es el libro Thinking in C++ de Bruce Eckel, desde su pagina principal puedes descargar su versión original en ingles o la versión (en desarrollo) en español.

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