[C] Szyfrowanie plików

0

Witam,
Mam problem, ponieważ muszę napisać program który będzie szyfrował słowa zawarte w pliku. Niestety szyfruje mi tylko jedno słowo, nie widzi reszty linijek/zdań

#include <stdio.h>
#include <string.h>

void szyfrowanie(char *wej, char *wyj) {
	char key[] = {'K', 'C', 'Q'};
	int i;
	for(i = 0; i < strlen(wej); i++) {
		wyj[i] = wej[i] ^ key[i % (sizeof(key)/sizeof(char))];
	}
}

int main (int argc, char *argv[]) {
    FILE *p1;
    char c[100];
	p1 = fopen("1.txt","r");
	while(fscanf(p1,"%s",c)!=EOF);

	char zaszy[strlen(c)];
	szyfrowanie(c, zaszy);
	printf("Zaszyfrowane :%s\n", zaszy);

	char odsz[strlen(c)];
	szyfrowanie(zaszy, odsz);
	printf("Odszyfrowane :%s\n", odsz);
	getchar();
}
0

doczytaj co zwraca fscanf
www.cplusplus.com/reference/cstdio/fscanf/
na dodatek średnik w złym miejscu, w którym while jest psute.

0

Wykombinowałem coś takiego i działa w każdym razie, wrzucam, może ktoś skorzysta

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define CHUNK 1024 /* read 1024 bytes at a time */

void zad()
{
char buf[CHUNK];
FILE *file;
size_t nread;

file = fopen("blah.txt", "r");
if (file) {
    while ((nread = fread(buf, 1, sizeof buf, file)) > 0)
        fwrite(buf, 1, nread, stdout);
    if (ferror(file)) {
        /* deal with error */
    }
    fclose(file);
}

    char szyfr[] = {"GADERYPOLUKI"};
    char zaszyfrowane[200000] = {'\0'};
    int i,j;
    for ( i = 0; i < strlen(buf); i++)
    {
        for ( j = 0; j < strlen(szyfr); j++)
        {
            if (buf[i] == szyfr[j])
            {
                if (j%2 == 0)
                {
                    zaszyfrowane[i] = szyfr[j+1];
                    break;
                }
                else
                {
                    zaszyfrowane[i] = szyfr[j-1];
                    break;
                }
            }
            else
            {
                zaszyfrowane[i] = buf[i];
            }
        }
    }
    printf("%s\n",zaszyfrowane);
}

int main()
{
    zad();

    return 0;
}
0

tyle, że to jest źle.
Wyłoży się na większych plikach.
Zawsze lepiej pociąć kod na mniejsze funkcję, które lepiej się czyta i rozumie.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define CHUNK 1024

char EncodeChar(char ch, const char *code)
{
     const char *p = strchr(code, ch);
     if (!p)
         return ch;
     return code[(p - code) ^ 1];
}

void EncodeBuff(char *buff, size_t dataSize, const char *code)
{
      size_t i;
      for (i=0; i<dataSize; ++i) {
            buff[i] = EncodeChar(buff[i], code);
      } 
}

void EncodeFile(FILE *source, FILE *dest, const char *code)
{
    char buff[CHUNK];
    size_t nread;
    size_t nwrite;

    while ((nread = fread(buff, 1, sizeof(buff), source)) > 0)
    {
        EncodeBuff(buff, nread, code);
        nwrite = fwrite(buff, 1, nread, dest);
        if (nwrite != nread)
             break; //error
    }
}

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