pobranie klucza z pliku

0

Hej mam za zadanie napisanie kodu - Szyfr Cezara.. Udało mi się cos napisac ale problem tkwi w tym ze nie mogę pobrać klucza z pliku czy ktoś może cos podpowiedzieć?

#include <stdio.h>
#include <math.h>
#define MAX 100

int main()
{
    int i = 0;
    char znak[20];
    int c, klucz, k;

    FILE* plik = fopen("plain", "r"); // czyta z pliku tekst jawny
    c = getc(plik);
    for (i = 0; (i < 80) && (feof(plik) == 0) && (c != '\n'); i++)
    {
        znak[i] = c;
        c = getc(plik);
    }


    printf("Kody: \n");
    for (i = 0; i < 7; i++)
    {
        printf("%d \t", znak[i]);
        printf("\n");
    }


    printf("Szyfrowanie : \n");

    FILE* plik1 = fopen("key.txt", "r"); // czyta z pliku klucz
    k = getc(plik1);
    for (i = 0; (i < 2) && (feof(plik1) == 0) && (k != '\n'); i++)
    {
        klucz = k;
        k = getc(plik1);


        for (i = 0; i < 7; i++)
        {
            if ((znak[i] >= 65) && (znak[i] < 90))
            {
                znak[i] -= 65;
                znak[i] += k;
                znak[i] = znak[i] % 26;
                znak[i] += 65;
                putc(znak[i], plik);
            }

            else if ((znak[i] >= 97) && (znak[i] <= 122))
            {
                znak[i] -= 97;
                znak[i] += k;
                znak[i] = (znak[i] % 26);
                znak[i] += 97;
                putc(znak[i], plik);
            }

            else if ((znak[i] >= 48) && (znak[i] <= 57))
            {
                znak[i] -= 48;
                znak[i] += k;
                znak[i] = (znak[i] % 10);
                znak[i] += 48;
                putc(znak[i], plik);
            }

            printf("%d ", znak[i]);
        }
    }
    fclose(plik1);

    printf("\nZamiana na litery\n");
    for (i = 0; i < 7; i++)
    {
        c = znak[i];
        printf(" \n ");
        printf("%d = %c\n", znak[i], c);
    }

    fclose(plik);

    return 0;
}
 
3

Pięknie zmienne nazywasz, c, znak, plik, plik1... dalej nie patrze bo sie boje.

2

Dlaczego nie możesz pobrać? Jaki jest oczekiwany wynik działania kodu, a jaki jest faktyczny? Trochę więcej szczegółów...

Dodatkowo:

  1. nie używaj magicznych liczb. Pomijając już to, że nie masz gwarancji użycia ASCII, to jest po prostu mniej czytelne
  2. tak jak @pingwindyktator napisał, nazewnictwo pozostawia bardzo wiele do życznia (zły język, nicniemówiące nazwy)
5

Myszka nie mogę ogarnąć tego kodu,

  1. gdzie wykorzystujesz zmienną klucz? (nie wykorzystujesz, teraz robisz jakieś operacje na k)
  2. Dlaczego nie wczytujesz go raz, w sensie:
  • metoda readKey (pętla do while(koniec pliku))
  • metoda encrypt(int key) (która przyjmuje parametr key i szyfrowanie w osobnej pętli a nie tka jak masz teraz)
  1. uwagi jak chłopcy piszą, angielskie nazwy, konkretne nazwy i te warunki dziwne typu znak == 65 to też zamień tka by zwykły śmiertelnik widział o co biega

Generalnie problem rozbija się pewnie o to, że wczytywanie klucza jeszcze się nie skończyło a ty juz próbujesz szyfrować (ta pętla szyfrowania w środku pętli czytania klucza).

4
  1. Twój kod wczytywania klucza, ten fragment jest bez sensu (Dlaczego ++key ? Co to ma robić w twoim mniemaniu?), generalnie kod, do wywalenia, bo nic nie robi sensownego:
do {
    printf ("%d",key);
    ++key;
} while (key <=2);

Samo wczytanie klucza czyli:

 fscanf(f,"%d",&key);

jest ok.

  1. Masz tablice 20-elementową
char znak[20];

ale w pętli masz: for(i=0;(i<80)&&(feof(p)==0) && (c != '\n'); i++)

 więc jeśli w pliku jest więcej niż 20 znaków w linii bez entera, to się wypieprzy.
0
 #include <stdio.h>
#include <math.h>

int main(){
int i=0;
char w;
char znak[80];
int key,key1,o,b,ap,k,z;
int abs(int abs);
char c,e,d,a;
printf ("wybierz opcje szyfr_Cezar - 1 , odszyf_Cezar - 2, szyfr_afiniczny - 3, deszyfr_afiniczny - 4 \n");
scanf ("%s",&w);

	


	

	
	if('c'){
	if('e'){
	FILE * f = fopen("key.txt", "r");
	fscanf(f,"%d",&key);
	fclose(f);

	FILE *p=fopen("plain", "r"); //czyta z pliku tekst jawny
	z = getc(p);
	for(i=0;(i<80)&&(feof(p)==0) && (z != '\n'); i++)
	{ znak[i] = z;
	z = getc(p);
	}
	fclose(p);

	printf("Kody: \n");
	for(i=0; i<11; i++)
	{
	printf ("%d \t", znak[i]);
	printf ("\n");
	
	}

	printf ("\nSzyfrowanie : \n");
	for(i=0; i<11; i++)
	{
	

	if((znak[i]>=65)&&(znak[i]<90))
	{
	znak[i]-=65;
	znak[i]+=key;
	znak[i]=znak[i]%26;
	znak[i]+=65;
	
	}

	else if((znak[i]>=97)&&(znak[i]<=122))
	{
	znak[i]-=97;
	znak[i]+=key;
	znak[i]=(znak[i]%26);
	znak[i]+=97;
	}

	else if ((znak[i]>=48)&&(znak[i]<=57))
	{
	znak[i]-=48;
	znak[i]+=key;
	znak[i]=(znak[i]%10);
	znak[i]+=48;
	}

	printf ("%d ", znak[i]);
	}
	

	printf ("\nZamiana na litery\n");
	FILE *out;
	out = fopen("crypto.txt","w+t");
	for(i=0; i<11; i++)
	{
	z=znak[i];
	printf (" \n ");
	printf ("%d = %c\n",znak[i], z);
	fprintf(out,"%c", z);
	
	}
	fclose(out);
	
}}


	if('c'){
	if('d'){

	FILE * f = fopen("key.txt", "r");
	fscanf(f,"%d",&key);
	fclose(f);

	FILE *q=fopen("crypto.txt", "r"); //czyta z pliku tekst jawny
	z = getc(q);
	for(i=0;(i<80)&&(feof(q)==0) && (z != '\n'); i++)
	{ znak[i] = z;
	z = getc(q);
	}
	fclose(q);
	
	
	
	

	printf ("\nOdszyfrowywanie : \n");
	
	
	
	for(i=0; i<11; i++){
	if((znak[i]>=65)&&(znak[i]<90))
	{
	znak[i]-=65;
	znak[i]-=key;
	if(znak[i]<0)
	znak[i]=26-abs(znak[i]);
	znak[i]+=65;
	
}
	else if((znak[i]>=97)&&(znak[i]<=122))
	{
	znak[i]-=97;
	znak[i]-=key;
	if(znak[i]<0)
	znak[i]=26-abs(znak[i]);
	znak[i]+=97;
	
	}



	else if ((znak[i]>=48)&&(znak[i]<=57))
	{
	znak[i]-=48;
	znak[i]-=key;
	if(znak[i]<0)
	znak[i]=10-abs(znak[i]);
	znak[i]+=48;
	}

	printf("%d\n",znak[i]);
}	

printf ("\nZamiana na litery\n");
	FILE *d;
	d = fopen("decrypt.txt","w+t");
	for(i=0; i<11; i++)
	{
	z=znak[i];
	printf (" \n ");
	printf ("%d = %c\n",znak[i], z);
	fprintf(d,"%c", z);
	}
	
	fclose(d);

}}

	if('a'){
	
	if('e'){	

	FILE * f = fopen("key.txt", "r");
	fscanf(f,"%d",&key);
	fscanf(f,"%d",&key1);
	fclose(f);
	
	
	FILE *p=fopen("plain", "r"); //czyta z pliku tekst jawny
	z = getc(p);
	for(i=0;(i<80)&&(feof(p)==0) && (z != '\n'); i++)
	{ znak[i] = z;
	z = getc(p);
	}
	fclose(p);

	printf("Kody: \n");
	for(i=0; i<11; i++)
	{
	printf ("%d \t", znak[i]);
	printf ("\n");
	
	}

	printf ("\nSzyfrowanie : \n");
	for(i=0; i<11; i++)
	{
	

	if((znak[i]>=65)&&(znak[i]<90))
	{
	znak[i]-=65;
	znak[i]*=key;
	znak[i]+=key1;
	znak[i]=znak[i]%26;
	znak[i]+=65;
	
	
	
	}

	else if((znak[i]>=97)&&(znak[i]<=122))
	{
	znak[i]-=97;
	znak[i]*=key;
	znak[i]+=key1;
	znak[i]=znak[i]%26;
	znak[i]+=97;
	}

	else if ((znak[i]>=48)&&(znak[i]<=57))
	{
	znak[i]-=48;
	znak[i]*=key;
	znak[i]+=key1;
	znak[i]=znak[i]%10;
	znak[i]+=48;
	}

   }
	

	printf ("\nZamiana na litery\n");
	FILE *out;
	out = fopen("crypto.txt","w+t");
	for(i=0; i<11; i++)
	{
	z=znak[i];
	printf (" \n ");
	printf ("%d = %c\n",znak[i], z);
	fprintf(out,"%c", z);
	
	}
	fclose(out);
}}
	
	if('a'){

	if('d'){

	FILE * f = fopen("key.txt", "r");
	fscanf(f,"%d",&key);
	fscanf(f,"%d",&key1);
	fclose(f);


	FILE *q=fopen("crypto.txt", "r"); //czyta z pliku tekst jawny
	c = getc(q);
	for(i=0;(i<80)&&(feof(q)==0) && (z != '\n'); i++)
	{ znak[i] = z;
	z = getc(q);
	}
	fclose(q);
	

	int wynik;
	
	k=key;
	int ap=0;

	while (wynik!=1){	//NWD 
	ap=ap+1;
	wynik=(ap*k)%26;
	printf ("%d\n",wynik);
}


	printf("Kody: \n");
	for(i=0; i<11; i++)
	{
	printf ("%d \t", znak[i]);
	printf ("\n");
	
	}

	printf ("\nSzyfrowanie : \n");
	for(i=0; i<11; i++)
	{
		

	if((znak[i]>=65)&&(znak[i]<90))
	{
	znak[i]-=65;
	znak[i]=(znak[i]*(-1)*wynik);
	znak[i]*=key1;
	znak[i]*=wynik;
	znak[i]=znak[i]%26;
	znak[i]+=65;
	
	
	
	}

	else if((znak[i]>=97)&&(znak[i]<=122))
	{
	znak[i]-=97;
	znak[i]=(znak[i]*(-1)*wynik);
	znak[i]*=key1;
	znak[i]*=wynik;
	znak[i]=znak[i]%26;
	znak[i]+=97;
	
	}

	else if ((znak[i]>=48)&&(znak[i]<=57))
	{
	znak[i]-=48;
	znak[i]=(znak[i]*(-1)*wynik);
	znak[i]*=key1;
	znak[i]*=wynik;
	znak[i]=znak[i]%10;
	znak[i]+=48;
	}

   }
	

	printf ("\nZamiana na litery\n");
	FILE *d;
	d = fopen("decrypt.txt","w+t");
	for(i=0; i<11; i++)
	{
	z=znak[i];
	printf (" \n ");
	printf ("%d = %c\n",znak[i], z);
	fprintf(d,"%c", z);
	
	}
	fclose(d);
}
}
	

return 0;
}
1
  1. Pytanie: użytkownik ma podać '1' dla opcji pierwszej czy 'a'?
  2. Twój if jest bez sensu 'c' nigdy nie jest true i nie sprawdza to podanej przez użytkownika zmiennej
    Zamień na
if(w=='a') 
  1. Nie widzę tego czemu masz dwa ify
if('a'){
 if('d'){

jeżeli chcesz sprawdzać dwie opcje to

if(rodzajSzyfru=='a' && opcja=='e' ) 

aha no i przedtem musisz wczytać dwie zmienne, czyli zamienić

scanf ("%s",&w);

na

scanf ("%s",rodzajSzyfru);
scanf ("%s",opcja);

no i dodać wyzej te zmienne.
Zastanów się ile opcji równolegle będziesz potrzebować, bo na tę chwilę to są dwie, więc dwie zmienne.
4. sformatuj kod, lepiej się czyta kod, który ma wcięcia, zrób to w ide albo na stronie: http://format.krzaq.cc/
5. no i kod nadal jest strasznie nieczytelny i bałaganiarski :(

0
 char c, e, d, a;
    char szyfr1;
    char szyfr2;
    char szyfruj;
    char odszyfruj;

    printf("wybierz opcje szyfr_Cezar - c e , odszyf_Cezar - c d, szyfr_afiniczny - a e, deszyfr_afiniczny - a d \n");
    scanf("%s", &szyfr1);
    scanf("%s", &szyfruj);

    if (szyfr1 == 'c' && szyfruj == 'e') {

        FILE* f = fopen("key.txt", "r");
        fscanf(f, "%d", &key);
        fclose(f);
2

Nieintuicyjnie zrobiłaś, w tym kierunku idź:

char rodzajSzyfru;
char szyfrujDeszyfruj;
 
printf("wybierz rodzaj szyfru szyfr_Cezar - c ,  szyfr_afiniczny - a \n");
scanf("%c", &rodzajSzyfru);
printf("wybierz opcje szyfruj - e ,  deszyfruj - d \n");
scanf("%c", &szyfrujDeszyfruj);
 
if (rodzajSzyfru == 'c' && szyfrujDeszyfruj == 'e') {
0
 #include <stdio.h>
#include <math.h>

int main()
{
    int i = 0;
    char w;
    char znak[80];
    int key, key1, o, b, ap, k, z;
    int abs(int abs);
    char c, e, d, a;
    char rodzajSzyfru;
    char szyfrujDeszyfruj;

    scanf("%s", &rodzajSzyfru);
    scanf("%s", &szyfrujDeszyfruj);

    if (rodzajSzyfru == 'c' && szyfrujDeszyfruj == 'e') {

        FILE* f = fopen("key.txt", "r");
        fscanf(f, "%d", &key);
        fclose(f);

        FILE* p = fopen("plain.txt", "r"); //czyta z pliku tekst jawny
        z = getc(p);
        for (i = 0; (i < 80) && (feof(p) == 0) && (z != '\n'); i++) {
            znak[i] = z;
            z = getc(p);
        }
        fclose(p);

        //kody ascii
        for (i = 0; i < 11; i++) {

            printf("\n");
        }

        //szyfrowanie
        for (i = 0; i < 11; i++) {

            if ((znak[i] >= 65) && (znak[i] <= 90)) {
                znak[i] -= 65;
                znak[i] += key;
                znak[i] = znak[i] % 26;
                znak[i] += 65;
            }

            else if ((znak[i] >= 97) && (znak[i] <= 122)) {
                znak[i] -= 97;
                znak[i] += key;
                znak[i] = (znak[i] % 26);
                znak[i] += 97;
            }

            else if ((znak[i] >= 48) && (znak[i] <= 57)) {
                znak[i] -= 48;
                znak[i] += key;
                znak[i] = (znak[i] % 10);
                znak[i] += 48;
            }
        }

        //zamienia na litery
        FILE* out;
        out = fopen("crypto.txt", "w+t");
        for (i = 0; i < 11; i++) {
            z = znak[i];
            printf(" \n ");

            fprintf(out, "%c", z);
        }
        fclose(out);
    }

    if (rodzajSzyfru == 'c' && szyfrujDeszyfruj == 'd') {

        FILE* f = fopen("key.txt", "r");
        fscanf(f, "%d", &key);
        fclose(f);

        FILE* q = fopen("crypto.txt", "r"); //czyta z pliku tekst jawny
        z = getc(q);
        for (i = 0; (i < 80) && (feof(q) == 0) && (z != '\n'); i++) {
            znak[i] = z;
            z = getc(q);
        }
        fclose(q);

        //odszyfrowanie

        for (i = 0; i < 11; i++) {
            if ((znak[i] >= 65) && (znak[i] <= 90)) {
                znak[i] -= 65;
                znak[i] -= key;
                if (znak[i] < 0)
                    znak[i] = 26 - abs(znak[i]);
                znak[i] += 65;
            }
            else if ((znak[i] >= 97) && (znak[i] <= 122)) {
                znak[i] -= 97;
                znak[i] -= key;
                if (znak[i] < 0)
                    znak[i] = 26 - abs(znak[i]);
                znak[i] += 97;
            }

            else if ((znak[i] >= 48) && (znak[i] <= 57)) {
                znak[i] -= 48;
                znak[i] -= key;
                if (znak[i] < 0)
                    znak[i] = 10 - abs(znak[i]);
                znak[i] += 48;
            }
        }

        //zmienia na litery
        FILE* d;
        d = fopen("decrypt.txt", "w+t");
        for (i = 0; i < 11; i++) {
            z = znak[i];
            printf(" \n ");

            fprintf(d, "%c", z);
        }

        fclose(d);
    }

    if (rodzajSzyfru == 'a' && szyfrujDeszyfruj == 'e') {

        FILE* f = fopen("key.txt", "r");
        fscanf(f, "%d", &key);
        fscanf(f, "%d", &key1);
        fclose(f);

        FILE* p = fopen("plain.txt", "r"); //czyta z pliku tekst jawny
        z = getc(p);
        for (i = 0; (i < 80) && (feof(p) == 0) && (z != '\n'); i++) {
            znak[i] = z;
            z = getc(p);
        }
        fclose(p);

        //kody ascii
        for (i = 0; i < 11; i++) {

            printf("\n");
        }

        //szyfrowanie
        for (i = 0; i < 11; i++) {

            if ((znak[i] >= 65) && (znak[i] <= 90)) {
                znak[i] -= 65;
                znak[i] *= key;
                znak[i] += key1;
                znak[i] = znak[i] % 26;
                znak[i] += 65;
            }

            else if ((znak[i] >= 97) && (znak[i] <= 122)) {
                znak[i] -= 97;
                znak[i] *= key;
                znak[i] += key1;
                znak[i] = znak[i] % 26;
                znak[i] += 97;
            }

            else if ((znak[i] >= 48) && (znak[i] <= 57)) {
                znak[i] -= 48;
                znak[i] *= key;
                znak[i] += key1;
                znak[i] = znak[i] % 10;
                znak[i] += 48;
            }
        }

        //zmienia na litery
        FILE* out;
        out = fopen("crypto.txt", "w+t");
        for (i = 0; i < 11; i++) {
            z = znak[i];
            printf(" \n ");

            fprintf(out, "%c", z);
        }
        fclose(out);
    }

    if (rodzajSzyfru == 'a' && szyfrujDeszyfruj == 'd') {

        FILE* f = fopen("key.txt", "r");
        fscanf(f, "%d", &key);
        fscanf(f, "%d", &key1);
        fclose(f);

        FILE* q = fopen("crypto.txt", "r"); //czyta z pliku tekst zaszyfrowany
        c = getc(q);
        for (i = 0; (i < 80) && (feof(q) == 0) && (z != '\n'); i++) {
            znak[i] = z;
            z = getc(q);
        }
        fclose(q);

        int wynik;

        k = key;
        int ap = 0;

        while (wynik != 1) { //NWD czy liczba wzglednie pierwsza
            ap = ap + 1;
            wynik = (ap * k) % 26;
        }

        //kody ascii
        for (i = 0; i < 11; i++) {

            printf("%d", znak[i]);
            printf("\n");
        }

        for (key1 = 1; key1 < 26; key1++)
            if ((key * key1) % 26 == 1) { //odwrotnosc liczby a, odwrotnosc wynosi k2=15 bo a=7
                printf("odwrotnosc liczby a = %d\n", key1);
            }

        //odszyfrowanie
        for (i = 0; i < 11; i++) {
            b = 5;
            if ((znak[i] >= 65) && (znak[i] <= 90)) {
                znak[i] -= 65;
                znak[i] -= b;
                znak[i] *= key1;
                znak[i] = znak[i] % 26;
                znak[i] += 65;
            }

            else if ((znak[i] >= 97) && (znak[i] <= 122)) {
                znak[i] -= 97;
                znak[i] -= b;
                znak[i] *= key1;
                znak[i] = znak[i] % 26;
                znak[i] += 97;
            }

            else if ((znak[i] >= 48) && (znak[i] <= 57)) {
                znak[i] -= 48;
                znak[i] -= b;
                znak[i] *= key1;
                znak[i] = znak[i] % 10;
                znak[i] += 48;
            }
        }

        //zmienia na litery
        FILE* d;
        d = fopen("decrypt.txt", "w+t");
        for (i = 0; i < 11; i++) {
            z = znak[i];
            printf(" \n ");
            printf("%d = %c\n", znak[i], z);
            fprintf(d, "%c", z);
        }
        fclose(d);
    }

    return 0;
}
4

Jeszcze kilka uwag, wiem, że ci zależy żeby działało, ale jak sama widzisz, mając bałagan tylko masz podwójną robotę, więc fajnie posprzątać.

  1. wywal
   int abs(int abs); 

język C posiada funkcję abs, nie musisz jej definiować.

  1. ehh jakbyś od początku próbowała to przerobić żeby kod był bardziej przyjazny to łatwiej by ci się dodawało kolejne opcje :(
  2. nazywaj zmienne jakoś po ludzku, wywal to k, bo jest to duplikacja key i nic nowego nie wnosi
  3. Wyliczasz "wynik" nic z tym wynikiem nie robisz potem
  4. piszesz strukturalnie, nie stosujesz funkcji a można by ten kod skrócić i to o wiele

Ciężko się w tym kodzie odnaleźć :(

1 użytkowników online, w tym zalogowanych: 0, gości: 1