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

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  como hacer programa en C de archivos
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: como hacer programa en C de archivos  (Leído 4,343 veces)
pefo

Desconectado Desconectado

Mensajes: 4


Ver Perfil
como hacer programa en C de archivos
« en: 4 Diciembre 2012, 01:37 am »

que el programa reciba del usuario el nombre de un archivo y una palabra, el programa debera quitar todas las veces que aparezca esa palabra dentro del archivo por ejemplo:

el archivo contiene:

anita lava la tina
amor a roma
tres tristes triges
tragaban trigo
en un trigal
debale arroz a la zorra del abad

el usuario le proporciona la palabra: tr

el archivo quedara

anita lava la tina
amor a roma
es istes iges
agaban igo
en un igal
debale arroz a la zorra del abad


no se como ir recorriendo el archivo letra por letra o si se deba hacer por lineas


En línea

durasno


Desconectado Desconectado

Mensajes: 373


Ver Perfil
Re: como hacer programa en C de archivos
« Respuesta #1 en: 4 Diciembre 2012, 05:49 am »

y creo q lo mejor es analizar linea por linea. Con la funcion strstr() podes buscar si existe esa subpalabra(dada por el usuario) en la cadena obtenida del archivo...

Lo mas dificil tal vez te resulte la parte de borrar esa subpalabra de la linea, pero bueno intenta hacer algo como para ayudarte


Saludos


En línea

Ahorrate una pregunta, lee el man
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: como hacer programa en C de archivos
« Respuesta #2 en: 4 Diciembre 2012, 16:06 pm »

Como procesar cada linea del archivo de entrada ya lo explico durasno: se obtiene cada una con fgets y se verifica la existencia de la cadena con strstr.

Para actualizar el archivo una forma sencilla es:

1) Se abre el archivo de entrada (el original) y uno temporal, para generar su nombre se puede utilizar la función tmpnam.

2) Se procesa cada linea del modo indicado y la linea modificada se envía al archivo de salida (el archivo temporal).

3) Una vez procesada cada linea se cierran los archivos, se elimina el archivo original con la función remove y se renombra el archivo temporal (dándole el nombre del archivo original) con la función rename.

Los prototipos de todas esas funciones se encuentran en el encabezado <stdio.h> con la excepción de strstr (para ella es <string.h>).

Un saludo
En línea

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
leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: como hacer programa en C de archivos
« Respuesta #3 en: 5 Diciembre 2012, 12:24 pm »

Hasta ahora he creado el archivo original y de él he sacado en un araray las líneas sin "tr". pero antes de continuar admito sugerencias de lo hecho, ya que no estoy muy ducho en el tema de ficheros.
No he usado strstr porque, aunque me localiza los valores de "tr" no se me ocurre como usar esa información para eliminarla de la nueva línea.
Como ven, estoy abierto a sugerencias y consejos respecto al tema:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define NOM_ARCHIVO  "eliminar tr.txt"
  5.  
  6. int main()
  7. {
  8.    int i=0,j,k=0;
  9.    int n_lineas =5;
  10.    char linea[81],linea1[n_lineas][81];
  11.    FILE* fichero;
  12.    fichero = fopen(NOM_ARCHIVO, "wt");
  13.    fputs("anita traba la ropa\n", fichero);
  14.    fputs("tremor en roma\n", fichero);
  15.    fputs("tres tristes triges\n", fichero);
  16.    fputs("tragaban trigo\n", fichero);
  17.    fputs("en un trigal", fichero);
  18.    fclose(fichero);
  19.    fichero = fopen(NOM_ARCHIVO, "rt");
  20.    if (fichero == NULL){
  21.        printf("No existe el fichero!\n");
  22.        return 1;
  23.    }
  24.    while (! feof(fichero)) {
  25.        fgets(linea, 81, fichero);
  26.        puts(linea);
  27.        for (j=0;linea[j]!='\0';j++) {
  28.            if (linea[j]=='t' && linea[j+1]=='r'){
  29.                j=j+1;continue;
  30.            }
  31.            else
  32.            linea1[i][k]=linea[j];k++;
  33.        }
  34.        linea1[i][k]='\0';   /*<==aqui tengo duda de si es correcto*/
  35.        printf ("%s", linea1[i]);i++;k=0;
  36.  
  37.    }
  38.    fclose(fichero);
  39.  
  40.    return 0;
  41. }
Saluditos!.
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: como hacer programa en C de archivos
« Respuesta #4 en: 6 Diciembre 2012, 02:09 am »

Comentarios sobre el programa:

* Cuando verifiques la apertura de un archivo si esta falla utiliza la función perror para generar el mensaje de error y si no estas seguro del valor de retorno utiliza EXIT_FAILURE (macro definida en <stdio.h>):
Código
  1. if ((fichero = fopen(NOM_ARCHIVO, "rt")) == NULL){
  2.   perror(NOM_ARCHIVO);
  3.   return EXIT_FAILURE;
  4. }

* No utilices la función feof para controlar la lectura de datos en un bucle ya que esa función retorna verdadero (diferente de cero) solo después que una función de lectura falla. En su lugar utiliza directamente el valor de retorno de la función fgets:
Código
  1. while (fgets(linea, 81, fichero) != NULL){
  2.   /* ... */
  3. }

* La sentencia "continue;" no es necesaria, en su lugar:
Código
  1. for (j = 0; linea[j] != '\0'; j++)
  2.   if (linea[j] != 't' || linea[j + 1] != 'r')
  3.      linea1[i][k++] = linea[j];

Por ultimo considerando que no haces nada con la cadena modificada puedes eliminar ese paso (almacenamiento) e imprimir directamente cada carácter mediante la función putchar.

Un saludo
En línea

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
leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: como hacer programa en C de archivos
« Respuesta #5 en: 6 Diciembre 2012, 15:53 pm »

Gracias por las correciones.
Sólo una duda más. Al usar while (fgets(frase, 81, fichero) != NULL) en lugar de while (! feof(fichero)) no me sale la primera línea ? ? ? ?

Citar
Por ultimo considerando que no haces nada con la cadena modificada puedes eliminar ese paso (almacenamiento) e imprimir directamente cada carácter mediante la función putchar.
Es para posteriormente guardarlas en un nuevo fichero
Saluditos!.
« Última modificación: 6 Diciembre 2012, 15:59 pm por leosansan » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: como hacer programa en C de archivos
« Respuesta #6 en: 6 Diciembre 2012, 16:11 pm »

Sólo una duda más. Al usar while (fgets(frase, 81, fichero) != NULL) en lugar de while (! feof(fichero)) no me sale la primera línea ?
Debería.

Si tomo tu programa y solo sustituyo estas dos sentencias:
Código
  1. while (! feof(fichero)) {
  2.   fgets(linea, 81, fichero);
Por:
Código
  1. while (fgets (linea, 81, fichero) != NULL){

El programa funciona correctamente imprimiendo todas la lineas empezando por "anita traba la ropa".

Un saludo
En línea

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
leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: como hacer programa en C de archivos
« Respuesta #7 en: 6 Diciembre 2012, 16:59 pm »

Debería.
Si tomo tu programa y solo sustituyo estas dos sentencias:
Código
  1. while (! feof(fichero)) {
  2.   fgets(linea, 81, fichero);
Por:
Código
  1. while (fgets (linea, 81, fichero) != NULL){
El programa funciona correctamente imprimiendo todas la lineas empezando por "anita traba la ropa".

Sin embargo en este otro, a no ser que la esté pifiando en alguna tonteria, sí se come la primera línea:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. main()
  4. {
  5.    FILE* fichero;
  6.    char frase[81];
  7.    fichero = fopen("cantidad.txt", "wt");
  8.    fputs("1\n", fichero);
  9.    fputs("5\n", fichero);
  10.    fputs("10", fichero);
  11.    fclose(fichero);
  12.    fichero = fopen("cantidad.txt", "rt");
  13.    if ((fichero = fopen("cantidad.txt", "rt")) == NULL){
  14.        perror("cantidad.txt");
  15.        return EXIT_FAILURE;
  16.    }
  17.    while (fgets(frase, 81, fichero) != NULL) {
  18.        fgets(frase, 80, fichero);
  19.        puts(frase);
  20.    }
  21.    fclose(fichero);
  22. }
.....................? ? ? ? ? .............
REEDITO: ¡¡¡¡¡Seré torpe !!!!!, claro que lee de dos en dos, porque son dos fgets: el del bucle y el siguiente. Mira que soy burro.
Tutti claro. Gracias por la lección amigo rir.
Saluditos!.
« Última modificación: 6 Diciembre 2012, 23:34 pm por leosansan » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: como hacer programa en C de archivos
« Respuesta #8 en: 6 Diciembre 2012, 17:38 pm »

Sin embargo en este otro, a no ser que la esté pifiando en alguna tonteria, sí se come la primera línea
Me temo que si.

Revisa con cuidado el bucle de tu programa:
Código
  1. while (fgets(frase, 81, fichero) != NULL){
  2.   fgets(frase, 80, fichero);
  3.   puts(frase);
  4. }
  5.  
Y encuentra porque se pierden las lineas primera, tercera, quinta, etc. Lo encuentras en menos de un minuto.

Un saludo
En línea

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
leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: como hacer programa en C de archivos
« Respuesta #9 en: 6 Diciembre 2012, 23:26 pm »

Me temo que si.

Revisa con cuidado el bucle de tu programa:
Código
  1. while (fgets(frase, 81, fichero) != NULL){
  2.   fgets(frase, 80, fichero);
  3.   puts(frase);
  4. }
  5.  
Y encuentra porque se pierden las lineas primera, tercera, quinta, etc. Lo encuentras en menos de un minuto.
Y una hora, día, semana ....... no lo pillo, y he ampiado el código para confirmar que se come los impares -o pares si empezamos desde cero- y nada.
 No entiendo lo que ocurre por más que lo reviso. .... help me !

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. main()
  4. {
  5.    FILE* fichero;
  6.    char frase[80];
  7.    fichero = fopen("cantidad.txt", "wt");
  8.    fputs("1\n", fichero);
  9.    fputs("2\n", fichero);
  10.    fputs("3\n", fichero);
  11.    fputs("4\n", fichero);
  12.    fputs("5\n", fichero);
  13.    fputs("6", fichero);
  14.    fclose(fichero);
  15.    fichero = fopen("cantidad.txt", "rt");
  16.    if ((fichero = fopen("cantidad.txt", "rt")) == NULL){
  17.        perror("cantidad.txt");
  18.        return EXIT_FAILURE;
  19.    }
  20.    while (fgets(frase, 80, fichero) != NULL) {
  21.        fgets(frase, 80, fichero);
  22.        puts(frase);
  23.    }
  24.    fclose(fichero);
  25.    return 0;
  26. }
Repito ...... HELP ME !!!![
P.D:Con lo a gustito que estaba yo con "while (! feof(fichero))", pero si el maestro rir dice lo que dice, razón lleva .... aunque yo no lo pille.
Citar
REEDITO: ¡ ¡ ¡ claro que va de dos en dos ! ! ! .... si es que tengo dos fgets, en el bucle y el siguiente que está de más. Seré burro.
Gracias "MAESTRO ", sí, es lo que pienso de tí querido amigo rir, y perdona la confianza.
Saluditos!.
« Última modificación: 6 Diciembre 2012, 23:40 pm por leosansan » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines