Título: [C] Llenar archivo Binario, y borrar datos mayores al promedio Publicado por: ramaa000 en 2 Marzo 2015, 19:43 pm Hola! Me presento, yo soy Ramaa000, armo este thread ya que estoy en problemas con este programita. Basicamente lo que sucede, es que cuando hago la impresion que debería mostrar el segundo archivo, ya cumpliendo lo que dice la consigna del programa (la dejo abajo en verde), se imprime el programa sin modificaciones. Espero me puedan ayudar. Desde ya gracias!
/*Leer por teclado (o generar al azar) una serie de numeros enteros y guardarlos en un archivo binario, finalizando la carga con un -1. Luego se solicita realizar un borrado logico de los registros superiores al promedio del mismo. Imprimir el archivo antes y despues del proceso de borrado, sin mostrar los elementos eliminados*/ Código
Mod: al publicar código usa las etiquetas GeSHi, las quote son para citas Ramaa000: @Mod, si, disculpas. Ví tu advertencia en otro tema, y vine a modificarlo. Gracias! EDITO. FINALMENTE PUDE RESOLVERLO Hice 2 cambios. No se cual de los dos dio efecto. El primero fue la función promedio no pasarle ningún dato por referencia, sino que dentro del main declaré un int prom, y le asigné a prom el valor devuelto por la función. Por otro lado, dentro de la función "borrar_prom" , realicé un fseek del archivo, retrocediendo un registro, y con el IRA posicionado en ese registro, ahí si pude cambiar el valor almacenado por un -1. Adjunto el código por si a alguien le sirve. Código
Gracias a los que se molestaron. Saludos Pd. No obstante, me gustaría tener una explicación de porque se solucionó con ese fseek, el de la línea 17, ya que no me queda muy claro. Título: Re: [C] Llenar archivo Binario, y borrar datos mayores al promedio Publicado por: rir3760 en 4 Marzo 2015, 16:59 pm me gustaría tener una explicación de porque se solucionó con ese fseek, el de la línea 17, ya que no me queda muy claro. No debes utilizar feof para controlar el bucle de lectura de datos, en su lugar puedes utilizar el valor de retorno de la función fread con lo cual el bucle termina así:Código
Es necesario utilizar fseek porque cada vez que lees/escribes en un archivo el indicador de posición de este avanza a la siguiente posición, si no fuera así y, por ejemplo, tratas de leer diez valores en las diez ocasiones leerías el mismo valor. En resumen con fread lees un valor, el indicador avanza a la siguiente posición, con fseek regresas a la posición del valor leído y finalmente con fwrite lo sobrescribes con un menos uno. Por ultimo la llamada a función: Código Es inútil porque indica que a partir de la posición actual (indicada por SEEK_CUR) se desplace ... cero bytes (segundo argumento). Un saludo Título: Re: [C] Llenar archivo Binario, y borrar datos mayores al promedio Publicado por: ramaa000 en 4 Marzo 2015, 18:42 pm Entiendo. Una pregunta, antes de este while, ¿es necesaria una lectura previa como con el feof?
Código Por otro lado, no entiendo una cosa, la condicion dice que mientras fread() == 1, ¿Cómo es eso que el fread puede ser igual o distinto a 1? Porque te refieres explicitamente a la función fread, y no a la variable donde almaceno el valor (dato) . Me queda esa duda unicamente. Por otro lado te comento, tenía en mis apuntes lo siguiente: "Si luego de grabar un archivo, quiero leerlo, tengo que reposicionar el indicador haciendo un fseek." Solamente lo hice por eso, porque lo tomé de mis apuntes, aunque como bien dices, no le veo utilidad. Saludos, y gracias por tu código. Título: Re: [C] Llenar archivo Binario, y borrar datos mayores al promedio Publicado por: rir3760 en 5 Marzo 2015, 02:57 am antes de este while, ¿es necesaria una lectura previa como con el feof? No es necesario, esa es una de las razones por las cuales no se recomienda feof: te obliga a duplicar las operaciones de lectura. En el caso que mencionas basta con una sola llamada fread la cual sirve como condición del bucle.Si te interesa ahondar sobre las razones para no usar feof te recomiendo utilizar el motor de búsqueda de los foros, encontraras una media docena de mensajes sobre ello. Código Por otro lado, no entiendo una cosa, la condicion dice que mientras fread() == 1, ¿Cómo es eso que el fread puede ser igual o distinto a 1? Porque te refieres explicitamente a la función fread, y no a la variable donde almaceno el valor (dato). Su valor de retorno es el numero de elementos leídos con éxito y que en tu caso si es uno indica una lectura exitosa lo que nos lleva a olvidarnos de feof (si la función retorna cero ello indica que se activo el indicador de error o fin de archivo). Un saludo |