Ayuda encriptación de fichero

Dudas sobre el C/C++ en general
Responder
Mensaje
Autor
juan_ma3
Mensajes: 1
Registrado: 08/11/2019 5:37 pm

Ayuda encriptación de fichero

#1 Mensaje por juan_ma3 » 08/11/2019 5:45 pm

Tengo que hacer un ejercicio que lea un archivo y lo encripte de la siguiente forma:
El primer caracter lo imprime tal cual como fue leido, pero en los demas casos, cada caracter es sustituido por el caracter en la posicion de la tabla ASCII que corresponde al módulo(%) 128 de la suma del código ASCII del caracter actual mas el caracter leido previamente.
Lo intenté así, pero sólo me muestra correctamente el primer caracter encriptado, agradezco ayuda

Código: Seleccionar todo

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
	char cadena[20];
	int i,j=0;
	int longitud;
	FILE *f;
	int encriptada;
	f = fopen("ejercicio6.txt","r");
	if(f == NULL){
		printf("Error al abrir el archivo");
		exit(1);
	}
	for(i = 0 ; !feof(f) ; i++){
		fscanf(f,"%s",cadena);
		printf("%s",cadena);
	}
	longitud=strlen(cadena);
	printf("\n");
	for(j=1 ; j < longitud ; j++){
		cadena[j] = cadena[j] + cadena[j-1] % 128;
		
	}
	printf("%s",cadena);
	fclose(f);
	
return 0;
}
Última edición por mollok el 09/11/2019 4:19 am, editado 1 vez en total.
Razón: Los códigos deben ir entre etiquetas 'code', botón </>

Avatar de Usuario
kiko66
Mensajes: 37
Registrado: 11/10/2019 10:51 am

Re: Ayuda encriptación de fichero

#2 Mensaje por kiko66 » 11/11/2019 12:04 pm

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?

Código: Seleccionar todo

char cadena[20];
-- 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

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: Google [Bot] y 6 invitados