hola juanma,
en tu codigo veo varias cosas que creo no estan bien:
-- primero de todo creando una cadena a leer de maximo 20,
¿que harias si en el fichero esta Esternocleidomastoideo?
-- haces un for ¿¿?? para que la variable i,
donde lees todo el fichero cadena a cadena y lo sacas por pantalla ¿¿??
Código: Seleccionar todo
for(i = 0 ; !feof(f) ; i++){
fscanf(f,"%s",cadena);
printf("%s",cadena);
}
-- cuando asignas valor a longitud seguramente es la de
EOF ya que es lo ultimo que lees para salir del bucle
analiza bien que hace este for ...
Código: Seleccionar todo
for(j=1 ; j < longitud ; j++){
cadena[j] = cadena[j] + cadena[j-1] % 128;
}
-- primero te dire que no haces el cifrado que te piden, por ahorrarte
unos parentesis, la precedencia del % es mayor que la del + asi que ...
-- suponiendo que los parentesis estan puestos, luego hazte una tabla y mira
que valor toma cadena[j] en la primera pasada del bucle y que valor tiene
cadena[j-1] en la segunda pasada del for
-- como, donde sacas el valor del primer caracter sin cifrar ¿?
-- por ultimo sacas la ultima cadena probablemente el EOF, supuestamente
cifrada, por pantalla, cuando el enunciado dice el contenido de un archivo ??¿¿
juanma,
estos fallos son normales al principio, para evitarlos lo mas sencillo es lo mejor,
coger papel y lapiz y hacerse un diagrama de flujo para ver claramente como
funciona tu idea, haz un seguimiento de las variables anotando los valores en una tabla.
parece que es una tonteria pero te ahorra muchos dolores de cabeza encontrando
errores antes de escribir el codigo
te paso una posible solucion al problema, espero te sirva
Código: Seleccionar todo
/*******************************************************************************
en vez de visualizarlo por pantalla, guardado el resultado del cifrado en otro
archivo porque podrian haber caracteres no imprimibles, que si quedarian
guardados en el archivo
*******************************************************************************/
#include <stdio.h>
int main(void){
int caracterA; // caracter previo
int caracterB; // caracter siguiente
int cararcterCf; // caracter cifrado
FILE* f_original; // fichero original sin encriptar
FILE* f_cifrado; // el fichero original una vez cifrado
f_original = fopen("ejercicio6.txt","r"); // se abre como lectura el f_original
if(f_original == NULL){ // se comprueba que no haya error al abrirlo
printf("Error al abrir el archivo");
return -1;
}
f_cifrado = fopen("ejercicio6.crp","w"); // se abre como escritura el f_cifrado
if(f_cifrado == NULL){ // se comprueba que no haya error al abrirlo
printf("Error al abrir el archivo");
return -1;
}
caracterA=fgetc(f_original); // sabemos que no es nulo, lo leemos
if(caracterA != fputc(caracterA, f_cifrado)) // guardamos en el archivo cifrado
return -1; // si hay error al guardar salimos con -1
if((caracterB=fgetc(f_original))==EOF) // leo el siguiente caracter,
return 0; // si no hay, programa acabado
do{
cararcterCf=(caracterA+caracterB)%128; // aqui quedaria cifrado
if(cararcterCf != fputc(cararcterCf, f_cifrado)) // compruebo que se guarde bien
return -1; // si no, salgo del programa con -1
caracterA=caracterB; // el segundo pasa a ser el primero
}while((caracterB=fgetc(f_original))!=EOF); // y leo el siguiente caracter si lo hay
fclose(f_original); // cerrando archivos
fclose(f_cifrado); //
return 0; // el programa acaba correctamente
}
desde luego este cifrado es bastante malo, le da igual leer unas " y un 0 (R) que c y una o (R)
saludos