Einfache Verschlüsselung von Datei mit XOR-Operator



  • Guten Abend,
    ich bin C-Anfänger und versuche zur Zeit ein Programm zu schreiben, dass einen Buchstaben einliest und auf jedes Zeichen einer Datei ein bitweises XOR mit diesem anwendet.

    /* Encrypt a file using the XOR-operator (^) in C */
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void) {
    	FILE *source, *target;
    	char fname[100];
    	char a, b, c;
    	printf("Please enter the filename:\n");
    	gets(fname);
    	printf("Now the letter to encrypt:\n");
    	b = getchar();
    	source = fopen(fname,"rb");
    	target = fopen("encrypted.txt","wb");
    	for(; !feof(source);) {
    		/* buchstabenweise eine Verknüpfung anlegen: Lese Zeichen ein, wende den Operator an and schreibe es in die
    		   neue verschluesselte Datei. */
    		a = fgetc(source);
    		if(feof(source)) {
    			printf("EOF");
    			break;
    		}
    		c = a^b;
    		//Write the encrypted char into the target file:
    		fputc(c, target);
    		} //TODO No entries in the target file!
    	//Close the streams:
    	fclose(source);
    	fclose(target);
    	return 0;
    }
    

    Das Problem ist folgendes:
    es erfolgt einfach keine Ausgabe in die Datei die mit *target referenziert wird, ich habe keine Ahnung warum. Vielen Dank im Voraus für eure Hilfe!
    Viele Grüße
    Unix1



  • Hast du Schreibrechte im Arbeitsverzeichnis (das ist das Verzeichnis, in dem du bist, wenn du das Programm ausführst)?



  • Oder könnte es sein dass das Arbeitsverzeichnis ein anderes ist als du denkst und so die Datei gar nicht eingelesen werden kann ?



  • Entweder Debugger oder ein paar mehr Testausgaben in deinem Programm.

    Hat das öffnen der Dateien geklappt?
    Werden Zeichen eingelesen? Welche?

    fgetc liefert ein int zurück. Unter anderem, damit auch ein EOF angezeigt werden kann. Nutze diese.

    int a;
    while((a = fgetc(source)) != EOF) {
    ...
    

    So wird auch schon beim einlesen vom ersten Zeichen ein EOF erkannt.



  • Die doppelte Verwendung von feof ist sinnfreies Programmdesign.
    Prüfe direkt nach jedem fopen den Rückgabewert und mache nicht einfach weiter.



  • Erstmal vielen Dank für so viele Antworten in kurzer Zeit! 🙂
    Nachdem ich eure Verbesserungsvorschläge übernommen habe, ist mir aufgefallen dass eine zuvor compilierte Version dieses Programms den Inhalt der Datei gelöscht haben muss weswegen auch keine sinnvolle Ausgabe in eine Datei möglich war 😕
    Dennoch vielen Dank für eure Hilfe!
    Viele Grüße
    Unix1


Log in to reply