Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Codigo C Archivos A-Y-U-D-A

Estas en el tema de Codigo C Archivos A-Y-U-D-A en el foro de C/C++ en Foros del Web. Buenas con todos me podrian ayudar porfavor en este codigo no se tengo un error pero no se cual es :( si me ayudarian corrigiendo ...
  #1 (permalink)  
Antiguo 15/02/2015, 14:03
 
Fecha de Ingreso: febrero-2015
Mensajes: 1
Antigüedad: 9 años, 2 meses
Puntos: 0
Pregunta Codigo C Archivos A-Y-U-D-A

Buenas con todos me podrian ayudar porfavor en este codigo no se tengo un error pero no se cual es :( si me ayudarian corrigiendo les agradeceria mucho.

Escriba un programa que dado el archivo redacción.txt, el cual contiene palabras en inglés, genera el archivo corregido.txt con su respectivo plural.
Para formar el plural se han definido las siguientes reglas:
- Si la palabra termina en “y”, remueva “y” y agregue “ies”. Por ejemplo: baby quedaría convertido en babies
- Si la palabra termina en “s”, “x”, “ch” o “sh” añada “es”. Por ejemplo: box quedaría convertido en boxes.
- Para todos los demás agregue “s”

Código C:
Ver original
  1. include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4. #include <string.h>
  5.  
  6. void CorregirPalabras(FILE *p, char *cadena);
  7.  
  8. void main()
  9. {
  10.     char nombre[30]="";
  11.  
  12.     FILE *ptrentrada,*ptrsalida;
  13.  
  14.     if ((ptrentrada = fopen("redaccion.txt","r"))==NULL)
  15.         printf("El archivo no puede abrirse\n");
  16.     else
  17.     {
  18.         ptrsalida=fopen("corregido.txt","w+");
  19.         while (!feof(ptrentrada))
  20.         {
  21.  
  22.             fscanf(ptrentrada,"%s",nombre);
  23.  
  24.             CorregirPalabras(ptrsalida,nombre);
  25.             nombre[0]='\0';
  26.         }
  27.         fclose(ptrentrada);
  28.         fclose(ptrsalida);
  29.     }          
  30. }
  31.  
  32.  
  33. void CorregirPalabras(FILE *p, char *cadena)
  34. {
  35.     char palabras[50];
  36.     char cadena1[50]="sh";
  37.     char cadena2[50]="ch";
  38.     while (!feof(p)){
  39.         fscanf(p,"%[^\n]s\n",palabras);
  40.         if (strchr(palabras,'y')==palabras)
  41.             strcpy(cadena1,"ies");
  42.         else if((strchr(palabras,'s')==palabras) || (strchr(palabras,'x')==palabras) || (strstr(palabras,cadena1)==palabras) || (strstr(palabras,cadena2)==palabras))
  43.             strcpy(cadena2,"es");
  44.         else
  45.             strcpy(cadena,"s");
  46.     }
  47.  
  48. }

Última edición por razpeitia; 15/02/2015 a las 21:01
  #2 (permalink)  
Antiguo 15/02/2015, 16:41
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
Respuesta: Codigo C Archivos A-Y-U-D-A

Lo primero es entender como trabaja fscanf.

La función fscanf se parece a la función scanf, también tienes algunos de sus "defectos". Uno de esos es que solo lee hasta encontrar un espacio, tabulador, el carácter enter '\n'.... Y esos son los que yo los se, seguro hay más pero de momento ya nos basta con saber que lee hasta el primer espacio y se detiene, lee hasta el siguiente y se detiene, la cosa es que lo hace en la misma linea.

Si con fscanf nos topamos el carácter '\n', entonces el puntero FILE se posiciona a la siguiente linea y repite todo el proceso. Eso todo lo hace hasta encontrar el carácter EOF que generalmente suele ser -1 (Es que no existe números negativos en la tabla asc2 por eso suele ser algún valor negativo ;) ), en el momento que encuentre el EOF se detiene. EOF significa "end of file" o "fin de archivo".

Bueno... Entonces fscanf nos viene de perla por que digamos que nos va partiendo el texto en palabras a las cuales podemos ir modificando y guardando en otro archivo.

Bien... ahora con la ayuda de un par de funciones podemos ajustar la palabra y guardarla en el fichero. Las 2 funciones en cuestión son la que tu ya tienes en tu programa (strchr) y una 2º que es memmove.

La función strchr busca una letra en una palabra y nos devuelve un puntero de donde se encuentra dicha letra, asi podemos sustituir todo lo que vaya adelante de ella. Si tienes baby, me interesa saber donde esta el 'y' entonces strchr nos sirve perfecto, podemos hacer lo que tu ya has echo pero guardando el puntero para después trabajar con el.
Ejemplo:
char *ptr = strchr( palabra,'y') ptr apunta a 'y', digamos que es palabra[3].

Ahora veremos la otra función. XD
la otra es memmove que sencillamente recibe un puntero que indica en una palabra desde donde queremos sustituir un texto. si tengo "baby" le digo que desde la 'y' sustituya por otro texto. Por ejemplo "ies". Es decir es tomar a "baby" pegar la 'i' encima de 'y' y seguir pegando las otras 2 de tras. Si el que quieres pegar encima del 1º es mas pequeño corres el riesgo de que no lo cubra completamente. Veamos como funciona.
Como ya tengo el puntero apuntando a la y gracias a char *ptr = strchr( palabra,'y') hago:
char ies[10] = "ies";
memmove(ptr, ies, 3); //pega 3 letras de la cadena ies y pega de ptr adelante.

Una forma mas compacta seria:
char ies[] = "ies";
memmove( strchr( palabra,'y'), ies, sizeof(ies)/sizeof(ies[0]) );

=D

Ahora solo tendríamos que enviar la palabra devuelta con fprintf XD
Bueno... solo hice para el caso del baby o sea 'y' por "ies", luego tu adapta y lo terminas con lo que aquí explique.
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. void CorregirPalabras ( FILE *p, char *cadena );
  5.  
  6. void main() {
  7.     char palabra[100] = "";
  8.     int fileLine = 1;   //iniciamos en la linea 1 del fichero
  9.    
  10.     FILE *ptrentrada, *ptrsalida;
  11.     if ( ( ptrentrada = fopen ( "redaccion.txt", "r" ) ) == NULL )
  12.         printf ( "El archivo no puede abrirse\n" );
  13.    
  14.     else {
  15.         ptrsalida = fopen ( "corregido.txt", "w+" );
  16.        
  17.         while ( !feof( ptrentrada ) ) {
  18.             //fscanf lee hasta un espacio, tabulador o el caracter '\n'.
  19.             //Obtiene una palabra para analizarla y aplicar los cambios si requerido.
  20.             fscanf ( ptrentrada, "%s", palabra );
  21.  
  22.             //Si no hay mas palabras que retocar no llamamos la funcion o repite la ultima palabra en el fichero de salida antes de terminar el programa.
  23.             if ( strcmp( palabra , "") != 0 ){
  24.                 //Enviamos el fichero donde se guradará y la palabra a efectuar el cambio
  25.                 CorregirPalabras ( ptrsalida, palabra );
  26.                
  27.                 //Obtenemos la posicion del puntero en el fichero. Util para saber si cambiamos de linea
  28.                 int n = ftell( ptrentrada );
  29.                
  30.                 //Si se detecta un salto de linea en el fichero de entrada lo aplicamos igual al de salida.
  31.                 if ( fgetc ( ptrentrada ) == '\n'){
  32.                     fileLine++;
  33.                     printf("Entramos en la linea numero %d", fileLine );
  34.                     fprintf ( ptrsalida, "\n");
  35.                 }
  36.  
  37.                 //formateamos la cadena
  38.                 strcpy( palabra, "" );
  39.             }
  40.         }
  41.         fclose ( ptrentrada );
  42.         fclose ( ptrsalida );        
  43.     }
  44.  
  45. }//main
  46.  
  47. void CorregirPalabras ( FILE *p, char *palabra ) {
  48.     //Declarar aqui las terminaciones que serviran de reemplazo
  49.     char ies[] = "ies";
  50.    
  51.     //caso para palabras terminadas en "y" que se cambiaran por "ies". Si no termina en "y" pasa directo y la imprime tal cual.
  52.     if ( strchr( palabra,'y') ){
  53.         memmove( strchr( palabra,'y'), ies, sizeof(ies)/sizeof(ies[0]) );
  54.     }
  55.    
  56.     //Enviamos la palabra al fichero de salida.
  57.     fprintf ( p, "%s ", palabra);
  58. }

El programa tiene bugs pero si lo afinas trabajará bien. Uno de ellos es que por ejemplo cuando encuentre una coma en el fichero de entrada no la crea en el fichero de salida etc etc. Todo depende de cuanto quieras retocarlo.

El cometido es explicarte como funciona las funciones para que te las montes tu a tu gusto.

Espero que sirva de ayuda =)

Suerte

Última edición por vangodp; 15/02/2015 a las 23:44

Etiquetas: char, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:27.