Autor
|
Tema: Duda con ejercicio de clase (Leído 3,618 veces)
|
foreground
Desconectado
Mensajes: 11
|
Buenas noches! En fin el caso es que llevo un cacao impresionante con la asignatura de Porgramación I de ingeniería industrial. El ejercicio que tenía que realizar en cuestión era un pequeño programa que contara las letras "z" y "Z" de un archivo llamado prueba.txt El tema está en que si el archivo está en blanco me devuelve que hay 0 Z pero si pongo cualquier otro carácter dentro del archivo al leerlo el programa se cuelga. No me ha dado ningún error al compilarlo pero me imagino que estaré haciendo una burrada así que espero que me ayuden. Este es el código en cuestión #include<stdio.h> #include<stdlib.h> int main() {FILE *f; FILE *s; int x=0; char c; f=fopen("prueba.txt","r"); if(f==NULL){printf("error al encontrar el archivo\n"); fclose (f); } else {while(fscanf(f,"%c",c)!=EOF) if((c='z')||(c='Z')) x++; } fclose(f); printf("hay %d z\n",x); system("PAUSE"); return 0; }
|
|
|
En línea
|
|
|
|
Caster
|
No se nada sobre ficheros y ese tema, pero te digo que si eso solo te pasa cuando hay algo escrito el problema estará a partir del else. Yo creo que el fallo está dentro del bucle while, pero no se.
Saludos
|
|
|
En línea
|
|
|
|
xiruko
Desconectado
Mensajes: 438
|
he intentado seguir tu codigo pero he desistido a los pocos segundos... tanto para ti como para alguien que tenga que leer tu codigo, el orden y ser minucioso es algo que se agradece muchisimo. aqui te dejo el code que funciona, ya que tu has aportado tu parte y seguramente el error estuviera en alguna llave que te hayas dejado o algun parentesis. lo he hecho con la funcion fread() en lugar de fscanf(), ya que me gusta mas comparar con caracteres leidos que no con EOF (es algo personal y no por ello mejor o peor), pero bueno al menos tienes un code funcional y asi puedes mirar que es lo que sucede en el tuyo. #include <stdio.h> int main() { FILE *f=NULL; int numeroZ=0, bytesLeidos; char c; f =fopen("prueba.txt","r"); if (!f) { printf("Error: No se pudo abrir el archivo.\n"); return 1; } do { bytesLeidos =fread(&c , sizeof(char), 1, f ); if (c=='z' || c=='Z') numeroZ++; } while (bytesLeidos>0); printf("Numero de 'z' y 'Z': %d\nPulsa enter para salir...", numeroZ ); return 0; }
por cierto, es muy pesado hacer una llamada al sistema para pausar el programa. en lugar de ello, con un simple getchar() se consigue el mismo efecto. un saludo! edito: donde estudias ingenieria industrial? yo la hago en barcelona y aun me acuerdo de lo TOSTon que era... xD
|
|
« Última modificación: 1 Octubre 2012, 01:02 am por xiruko »
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
....era un pequeño programa que contara las letras "z" y "Z" de un archivo llamado prueba.txt.... Y por qué no e y E o s y S ...... para no alterar el código mucho, entro las letras a contar en los "define", así si te pide otro juego de letras sólo tendrás que cambiar dichos define. Para que veas que funciona te "creo"y escribo el fichero con dos líneas -los "fputs"-. Espero te sea de ayuda: #include<stdio.h> #include<stdlib.h> #define letra 'o' #define LETRA 'O' int main() { FILE *fichero; int nletra=0; char c; fichero =fopen("prueba.txt","w"); if(fichero==NULL) { printf("error al buscar el archivo\n"); return 1; } fputs("Esto es una linea\n", fichero ); fputs("Esto es otra y estO es continuacion de lo anterior", fichero ); fichero =fopen("prueba.txt","r"); do { if (c == letra || c == LETRA) nletra++; } while (c != EOF); printf("Numero de '%c' y '%c': %d",letra ,LETRA , nletra ); printf ("\nPresiona ENTER para salir:"); ; return 0; }
|
|
|
En línea
|
|
|
|
xiruko
Desconectado
Mensajes: 438
|
;
una pregunta... por que ultimamente poneis por aqui esto de esta manera? y no como cualquier otra sentencia:
ademas que eso no es para pausar el programa aunque lo haga, sino que eso se utiliza para vaciar el bufer de entrada stdin despues de haber usado scanf para leer algun entero por ejemplo. si este fuera el caso, tu programa no se pausaria ya que quedaria seguro un \n en stdin y por lo tanto no se haria la pausa. realmente eso se usa para limpiar el bufer de entrada, y luego simplemente con un getchar() se pausa el programa a la espera de que el usuario presione enter. pero bueno que mi post simplemente es por el ";" puesto de esa manera, ya que intento ser bastante minucioso y no se por que lo poneis asi xD un saludo!
|
|
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
No me ha dado ningún error al compilarlo pero me imagino que estaré haciendo una burrada así que espero que me ayuden. Los errores son dos y se encuentran en el bloque "else" del condicional, estos son la falta del operador '&' en la llamada a "fscanf" y el uso del operador de asignación '=' cuando debería ser el de comparación "==". Esa parte con las correcciones: }else { while (fscanf(f , "%c", &c ) != EOF ) if ((c == 'z') || (c == 'Z')) x++; }
Ademas declaras dos variables de tipo "FILE *" cuando solo necesitas una, puedes eliminar la variable "s" sin problemas. En cuanto al programa de leosansan hay que tener cuidado cuando se utilizan las funciones "getchar", "fgetc" y "getc" ya que su tipo de retorno no es "char", es "signed int". Ello porque esas funciones deben retornar el carácter (puede ser cualquiera) mas un valor único para indicar el estado de fin de archivo (EOF). En buen cristiano hay que cambiar el tipo de la variable "c", mas o menos así: int c; /* ... */ while ((c = getc(fichero )) != EOF ) if (c == letra || c == LETRA) nletra++;
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
|
|
|
Caster
|
;
una pregunta... por que ultimamente poneis por aqui esto de esta manera? y no como cualquier otra sentencia:
ademas que eso no es para pausar el programa aunque lo haga, sino que eso se utiliza para vaciar el bufer de entrada stdin despues de haber usado scanf para leer algun entero por ejemplo. si este fuera el caso, tu programa no se pausaria ya que quedaria seguro un \n en stdin y por lo tanto no se haria la pausa. realmente eso se usa para limpiar el bufer de entrada, y luego simplemente con un getchar() se pausa el programa a la espera de que el usuario presione enter. pero bueno que mi post simplemente es por el ";" puesto de esa manera, ya que intento ser bastante minucioso y no se por que lo poneis asi xD un saludo! Pues realmente da igual como ponerlo, el resultado será el mismo, y ya se ha explicado en otros post y varias veces además, la función de ese bucle, ya se sabe que es para limpiar el buffer. Saludos
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
duda clase phpmailer
PHP
|
miadagio
|
0
|
3,661
|
20 Mayo 2010, 21:39 pm
por miadagio
|
|
|
duda Clase de reflexion
Java
|
Afsoon
|
2
|
2,421
|
9 Noviembre 2010, 16:08 pm
por Afsoon
|
|
|
Error en ejercicio de clase
Programación C/C++
|
foreground
|
3
|
2,963
|
14 Octubre 2012, 17:07 pm
por bemone
|
|
|
Problema con ejercicio de separar interfaz de implementación de una clase
Programación C/C++
|
Mordecai
|
1
|
2,540
|
14 Septiembre 2013, 04:49 am
por erest0r
|
|
|
Ayuda ejercicio clase c++
Programación C/C++
|
LeoHom
|
4
|
3,338
|
6 Diciembre 2021, 19:25 pm
por Eternal Idol
|
|