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

[SOLUCIONADO] problema con funcion en C ejercicio de ficheros

Estas en el tema de problema con funcion en C ejercicio de ficheros en el foro de C/C++ en Foros del Web. hola buen dia tengo un problema con esta funcion, necesito que la funcion detecte todas las letras mayusculas dentro de un texto que tengo guardado. ...
  #1 (permalink)  
Antiguo 28/02/2015, 16:52
 
Fecha de Ingreso: noviembre-2014
Ubicación: guadalajara
Mensajes: 14
Antigüedad: 10 años
Puntos: 0
Pregunta problema con funcion en C ejercicio de ficheros

hola buen dia tengo un problema con esta funcion, necesito que la funcion detecte todas las letras mayusculas dentro de un texto que tengo guardado.
pero la funcion que hize mayus no da resultado
El if que tengo dentro del main si funciona pero la idea es que en el main no haya nada de eso, tengo que hacer funciones aparte y llamarlas desde el main no se cual sea mi error o si de plano todo esta mal no he trabajado mucho con funciones

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
  4.  
  5. FILE *arch;
  6. char c;
  7.  
  8.     int mayus(FILE *txt)
  9.     {
  10.         int c, cont_may = 0;
  11.  
  12.             while (!feof (arch))
  13.             {
  14.                 c = fgetc(arch);
  15.                 if(c >64 && c <91)
  16.                 {
  17.                 cont_may ++;
  18.  
  19.                 }
  20.             }
  21.     return c;
  22.     }
  23.  
  24.     int main (){
  25.  
  26.     int cont_min = 0;
  27.  
  28.         arch=fopen("hola.txt", "r");
  29.         system ("cls");
  30.  
  31.         while (!feof (arch))
  32.         {
  33.             c = fgetc(arch);
  34.             printf("%c",c);
  35.  
  36.  //Este if lo puse para verificar que funcione y si lo hace pero si lo quiero poner fuera del main como una funcion, no se como hacerlo
  37.         if(c >64 && c <91)
  38.             {
  39.                 cont_may++;
  40.  
  41.             }
  42.  
  43.  
  44.         }
  45.         char a;
  46.         mayus(&a);
  47.         printf("cantidad de mayusculas es:%i",a);
  48.  
  49.         printf("suma:%i\n",cont_min);
  50.  
  51.  
  52.         fclose(arch);
  53.  
  54.     }

Última edición por razpeitia; 28/02/2015 a las 17:35
  #2 (permalink)  
Antiguo 28/02/2015, 19:31
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 9 meses
Puntos: 3
Respuesta: problema con funcion en C ejercicio de ficheros

lo estas orientando mal. Lo primero raro que veo es que la funcion tiene como parametro un puntero de tipo FILE el cual no se usa y que en su lugar usas otro global. Eso es algo muy feo y poco reutilizable. Despues en la funcion main usas un bucle while para recorrer todo el fichero y dentro de ese bucle llamas a tu funcion pero dentro de tu funcion tienes el mismo bucle con lo que hay dos problemas, el primero es que el bucle del main no sirve para nada ya que al salir de tu funcion, al leer otro caracter obtendrias eof o incluso algo raro. El segundo es que el return siempre devolveria el ultimo caracter y no el resto. Hay varias formas de afrontar esto. Puedes dejar el bucle del main y quitar el de la funcion, o puedes hacer uso de la variable que cuenta las mayusculas en tu funcion, y que no usas, para allocar memoria con malloc y en vez de retornar un char pues retornas un char*. A ver si mañana con tiempo puedo verlo y te pongo algo que funcione porque tienes un cacao muy gordo. ¿Que quieres retornar en la funcion realmente? ¿El caracter? ¿El numero de mayusculas?

Última edición por aguml; 28/02/2015 a las 19:37
  #3 (permalink)  
Antiguo 28/02/2015, 23:26
 
Fecha de Ingreso: noviembre-2014
Ubicación: guadalajara
Mensajes: 14
Antigüedad: 10 años
Puntos: 0
Sonrisa Respuesta: problema con funcion en C ejercicio de ficheros

Cita:
Iniciado por aguml Ver Mensaje
lo estas orientando mal. Lo primero raro que veo es que la funcion tiene como parametro un puntero de tipo FILE el cual no se usa y que en su lugar usas otro global. Eso es algo muy feo y poco reutilizable. Despues en la funcion main usas un bucle while para recorrer todo el fichero y dentro de ese bucle llamas a tu funcion pero dentro de tu funcion tienes el mismo bucle con lo que hay dos problemas, el primero es que el bucle del main no sirve para nada ya que al salir de tu funcion, al leer otro caracter obtendrias eof o incluso algo raro. El segundo es que el return siempre devolveria el ultimo caracter y no el resto. Hay varias formas de afrontar esto. Puedes dejar el bucle del main y quitar el de la funcion, o puedes hacer uso de la variable que cuenta las mayusculas en tu funcion, y que no usas, para allocar memoria con malloc y en vez de retornar un char pues retornas un char*. A ver si mañana con tiempo puedo verlo y te pongo algo que funcione porque tienes un cacao muy gordo. ¿Que quieres retornar en la funcion realmente? ¿El caracter? ¿El numero de mayusculas?
si quiero que retorne el numero de mayusculas declarar mi funcion fuera del main y ya desde el main solo llamarla pero no tengo muy claro como hacer funciones, necesito que el programa haga mas cosas pero ocupo hacer que una funcion trabaje bien y ya con eso ya puedo guiarme para hacer las de mas
  #4 (permalink)  
Antiguo 01/03/2015, 00:31
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 2 meses
Puntos: 38
Respuesta: problema con funcion en C ejercicio de ficheros

El código comentado.

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int mayus ( FILE * file ) {
  5.     int c;
  6.     int mayusculas = 0;    
  7.    
  8.     //Hasta llegar al final del fichero...
  9.     while ( !feof ( file ) ) {
  10.         //...leerá letra por letra...
  11.         c = fgetc ( file );
  12.        
  13.         //...imprimiendo y contando solo las mayusculas.
  14.         if ( c > 64 && c < 91 ) {
  15.             printf ( " %c", c );
  16.             mayusculas++;
  17.         }    
  18.  
  19.     }
  20.    
  21.     //de no haber letras en el archivo retorna 0
  22.     if ( mayusculas == 0 ){
  23.         return 0;
  24.        
  25.     //Si hay letras en el fichero retorna la cantidad.
  26.     }else{
  27.         return mayusculas;
  28.     }
  29. }
  30.  
  31. int main () {
  32.     FILE * arch;  // <- Aqui se crea el puntero. Evite crear globales el maximo pocible
  33.    
  34.     //Muy importante hacer la comprobacion para saber si existe el fichero o no. De no haber ninguno no hay nada que leer y se debe interrumpir aqui por lo sano.
  35.     if ( !(arch = fopen ( "prueba.txt", "r" )) ){
  36.         printf("No existe ningun archivo llamado prueba.txt");
  37.         return 1;
  38.     }
  39.    
  40.     //mayus devuelve un entero que es el numero de mayusculas. Ese printf puedes poner dentro de la misma funcion si quisieras.
  41.     printf ( "\n\ncantidad de mayusculas es:%d\n", mayus(arch) ); //LLamamos a mayus pasando el archivo
  42.    
  43.     //Al final cierra el archivo
  44.     fclose ( arch );
  45.     //hacemos una pausa
  46.     getchar();
  47.     //retornamos cero que en nuestro caso quiere decir "todo correcto".
  48.     return 0;
  49. }

Debes practicar y mucho con los archivos.

En esta pagina puedes encontrar una buena explicación y también muchos ejemplos sobre ficheros: http://www.c.conclase.net/ficheros/

Ahora si copias y pegas el código sin haber entendido nada apenas no lograrás gran cosa, y te estarás engañando a ti mismo.

busca en internet sobre funciones, ficheros etc etc. La pagina que te pase es muy buena.

Suerte
  #5 (permalink)  
Antiguo 01/03/2015, 04:21
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 9 meses
Puntos: 3
Respuesta: problema con funcion en C ejercicio de ficheros

Amigo tu codigo no está mal pero la parte donde retornas el numero de mayusculas con el if...else sobra, simplemente pon esto:
Código C:
Ver original
  1. return mayusculas;
  #6 (permalink)  
Antiguo 01/03/2015, 07:58
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 2 meses
Puntos: 38
Respuesta: problema con funcion en C ejercicio de ficheros

ui O_O lleva razón. De primera hora la había echo así:
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int mayus ( FILE * file, int mayusculas = 0 ) {
  5.     int c = fgetc ( file );
  6.    
  7.     if ( c > 64 && c < 91 ) {
  8.         printf ( " %c", c );
  9.         mayusculas++;
  10.     }    
  11.  
  12.     if ( mayusculas == 0 ){
  13.         return 0;
  14.        
  15.     }else{
  16.         return mayusculas;
  17.     }
  18. }
  19.  
  20. int main () {
  21.     FILE * arch;
  22.     int mayusculas = 0;
  23.     if ( !(arch = fopen ( "prueba.txt", "r" )) ){
  24.         printf("No existe ningun archivo llamado prueba.txt");
  25.         return 1;
  26.     }
  27.    
  28.     while ( !feof ( arch ) ) {
  29.         mayusculas += mayus(arch);
  30.     }
  31.  
  32.     printf ( "\n\ncantidad de mayusculas es:%d\n", mayusculas );
  33.    
  34.     fclose ( arch );
  35.     getchar();
  36.     return 0;
  37. }

Se me escapo quitar eso después de adaptar todo dentro de la función. Si llega a ser para mi hasta el printf va dentro XD.

Efectivamente tiene el mismo efecto quitar if else y poner solo el return, más cortito se queda el código XDD. Gracias por avisar pero no se si puedo editar a esas alturas.
  #7 (permalink)  
Antiguo 01/03/2015, 08:47
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 9 meses
Puntos: 3
Respuesta: problema con funcion en C ejercicio de ficheros

Yo lo dejaría así:
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. //Prototipos de funciones
  5. int mayus ( FILE * file );
  6.  
  7. int main () {
  8.    FILE * arch;  // <- Aqui se crea el puntero. Evite crear globales el maximo pocible
  9.    int retval;
  10.    //Muy importante hacer la comprobacion para saber si existe el fichero o no. De no haber ninguno no hay nada que leer y se debe interrumpir aqui por lo sano.
  11.    arch = fopen ( "prueba.txt", "r" );
  12.    if ( !arch ){
  13.       printf("\n\nNo existe ningun archivo llamado prueba.txt\n\n");
  14.       retval = -1;
  15.    }else{
  16.       retval = mayus(arch);
  17.       //mayus devuelve un entero que es el numero de mayusculas. Ese printf puedes poner dentro de la misma funcion si quisieras.
  18.       printf ( "\n\ncantidad de mayusculas es:%d\n\n", retval ); //LLamamos a mayus pasando el archivo
  19.    }
  20.  
  21.    //Al final cierra el archivo
  22.    fclose ( arch );
  23.    //hacemos una pausa
  24.    system("PAUSE");
  25.    //retornamos cero que en nuestro caso quiere decir "todo correcto".
  26.    return retval;
  27. }
  28.  
  29. int mayus ( FILE * file ) {
  30.    int c;
  31.    int mayusculas = 0;
  32.  
  33.    //Hasta llegar al final del fichero...
  34.    while ( !feof ( file ) ) {
  35.       //...leerá letra por letra...
  36.       c = fgetc ( file );
  37.  
  38.       //...imprimiendo y contando solo las mayusculas.
  39.       if ( c >= 'A' && c <= 'Z' ) {
  40.          printf ( " %c", c );
  41.          mayusculas++;
  42.       }
  43.    }
  44.    return mayusculas;
  45. }
  #8 (permalink)  
Antiguo 01/03/2015, 09:08
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 2 meses
Puntos: 38
Respuesta: problema con funcion en C ejercicio de ficheros

Ha quedado más pro así, muy bien pues. XD
Ya tiene crash_16109 su respuesta sobrada.
Suerte.
  #9 (permalink)  
Antiguo 01/03/2015, 09:30
lareto
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: problema con funcion en C ejercicio de ficheros

Un par de comentarios.
Cita:
while ( !feof ( file ) ) {
no está bien.
Entre otras cosas, porque puede suceder un error de lectura, y en ese caso jamás se saldrá del ciclo.
Y
Cita:
system("PAUSE");
es una de esas prácticas tan difundidas que ya ni nos llama la atención. Yo creo que programar en C para hacer una cosa como system("PAUSE") es absurdo.
(Sugiero http://www.cplusplus.com/forum/articles/11153/ )
  #10 (permalink)  
Antiguo 01/03/2015, 14:15
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años, 2 meses
Puntos: 38
Respuesta: problema con funcion en C ejercicio de ficheros

y con que quieres parar el bucle? Se mas especifico con los errores que dices :/
  #11 (permalink)  
Antiguo 01/03/2015, 15:44
lareto
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: problema con funcion en C ejercicio de ficheros

https://www.google.co.uk/search?q=%2...+!feof+%28+%22
  #12 (permalink)  
Antiguo 01/03/2015, 17:54
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 9 meses
Puntos: 3
Respuesta: problema con funcion en C ejercicio de ficheros

no estoy de acuerdo, en el caso de system, forma parte del estandar y funciona perfectamente y ademas el que con system se pueda lanzar un proceso con privilegios system no es cierto, al menos desde Xp sp3. En el caso de feof quizas seria mejor hacer algo como do[ c=fgetc(arch); if(ferror) break; ]while(!ferror(arch)); Estoy desde el movil y no me deja poner saltos de linea y tampoco corchetes
  #13 (permalink)  
Antiguo 01/03/2015, 21:03
 
Fecha de Ingreso: noviembre-2014
Ubicación: guadalajara
Mensajes: 14
Antigüedad: 10 años
Puntos: 0
De acuerdo Respuesta: problema con funcion en C ejercicio de ficheros

Cita:
Iniciado por aguml Ver Mensaje
lo estas orientando mal. Lo primero raro que veo es que la funcion tiene como parametro un puntero de tipo FILE el cual no se usa y que en su lugar usas otro global. Eso es algo muy feo y poco reutilizable. Despues en la funcion main usas un bucle while para recorrer todo el fichero y dentro de ese bucle llamas a tu funcion pero dentro de tu funcion tienes el mismo bucle con lo que hay dos problemas, el primero es que el bucle del main no sirve para nada ya que al salir de tu funcion, al leer otro caracter obtendrias eof o incluso algo raro. El segundo es que el return siempre devolveria el ultimo caracter y no el resto. Hay varias formas de afrontar esto. Puedes dejar el bucle del main y quitar el de la funcion, o puedes hacer uso de la variable que cuenta las mayusculas en tu funcion, y que no usas, para allocar memoria con malloc y en vez de retornar un char pues retornas un char*. A ver si mañana con tiempo puedo verlo y te pongo algo que funcione porque tienes un cacao muy gordo. ¿Que quieres retornar en la funcion realmente? ¿El caracter? ¿El numero de mayusculas?
si quiero que retorne el numero de mayusculas declarar mi funcion fuera del main y ya desde el main solo llamarla pero no tengo muy claro como hacer funciones

gracias a ambos si me enrede en el acomodo ya estoy por teminar el programa completo

Etiquetas: char, dado, ejercicio, ficheros, funcion, int
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 03:16.