Pfadeingabe funzt nicht richtig bei Verschlüsselungsprogramm(Montag Abgabe, Hilfe!)
-
Hallo zusammen,
ich brauche mal wieder eure Hilfe. Sitze seit einiger Zeit an diesem Verschlüsselungsprogramm und es wird mal wieder knapp weil morgen schon wieder Abgabe ist.Ich habe das Programm mit festen File-Pointern getestet. Verschlüsselung lief dann wunderbar. Jetzt wollte ich gerade noch für die Final-Version eine Eingabe des Pfades der Dateien einbauen. Aber jetzt läuft fgets nicht mehr.
Wäre toll wenn da mal einer drüber sehen könnte ob er einen Fehler sieht.Vielleicht haben ja auch ein paar Leute Interesse an der Verschlüsselung. Erklärung: Die Datei wird zeilenweise eingelesen. Dann wird ein Codewort eingelesen das in einer verketteten Liste immer wieder hintereinander gehängt wird (z.B. CodeCodeCodeCode...) Beide Strings werden characterweise in ASCII-Code umgewandelt und addiert. Beim entschlüsseln wird der ASCII Code des Codeworts wieder subtrahiert. Nicht wiklich sicher aber immerhin...
#include <stdio.h> /* Library für I/O-Befehle */ #include <string.h> /* Library für "strlen()" */ #include <conio.h> /* Library für "getch()" */ #include <stdlib.h> /* Library für "malloc()" und "system()" */ /* Struktur für Codewort (hinntereinander hängend) */ struct vListe { char character ; struct vListe * next; } ; /* Funktion die die Quelldatei zeilenweise ausliest, verschlüsselt und zeilenweise * in die Zieldatei schreibt. * empfangene Übergabeparameter: * 1. Filepointer auf Quelldatei * 2. Filepointer auf Zieldatei * 3. Pointer auf String mit Codewort */ void encode(FILE * input, FILE * output, char * code) { /* Variable zum Zwischenspeichern des Dateiinhalts */ char TextIn[1026] ; /* Variable zum Zwischenspeichern der Ausgabe */ char TextOut[1026] ; /* Variable zum Zwischenspeichern der ASCII-Werte */ int ascii ; /* speichert Länge der eingelesenen Zeile */ int length ; /* Zählervariablen */ int i, i2 ; /* Variable für Länge des Codeworts */ int codelen ; /* Variable in der der ASCII-Code des Codewort-Zeichens gespeichert wird */ int codeascii ; /* Prüfvariable die auf "0" gesetzt wird wenn das Dateiende erreicht wurde */ int returnf ; /* ASCII-Bereich mit darstellbaren Zeichen */ int zmin = 32 ; int zmax = 126 ; /* Länge des Codeworts wird in "codelen" gespeichert */ codelen = strlen(code) ; codelen-- ; /* Deklaration der Strukturpointer */ struct vListe * ende ; struct vListe * temp ; struct vListe * neu ; /* erste Struktur mit dem letzten Buchstaben des Codeworts wird angelegt */ ende = (vListe*) malloc(sizeof(struct vListe)) ; ende->character = code[codelen] ; /* temporärer Pointer auf die letzte Liste */ temp = ende ; /* Die Schleife verkettet die Listen imt den einzelnen Buchstaben des Codeworts */ do{ codelen-- ; neu = (vListe*) malloc(sizeof(struct vListe)) ; neu->character = code[codelen] ; neu->next = temp ; temp = neu ; }while(codelen > 0) ; /* Setzt Pointer in der Liste des letzten Buchstabens auf die Adresse der * Liste des ersten Buchstabens. */ ende->next = temp ; /* Schleife die die Quelldatei zeilenweise verarbeitet und in die Ausagebdatei speichert */ do{ /* Prüft ob fgets eine weiter Zeile fehlerfrei einlesen konnte oder ob das Dateiende * erreicht wurde. */ if((fgets(TextIn, 1026, input)) != NULL) { /* Länge der eingelesenen Zeile wird bestimmt und in length gespeichert */ length = strlen(TextIn) ; length = length - 1 ; /* Schleife die die ASCII-Codes der eingelesenen Zeile und des Codeworts zeichenweise * addiert. */ for(i=0; i < length ; i++) { /* Speichert den ASCII-Code des Input-Buchtabens [i] in "int ascii" */ /* int char */ ascii = TextIn[i] ; /* ASCII-Code des aktuellen Code-Buchstabens wird in "codeascii" gespeichert */ codeascii = neu->character ; /* springt in die nächste Liste (mit dem nächsten Buchstaben des Codeworts) */ neu = neu->next ; /* ASCII-Code des Input-Buchstabens wird mit ASCII-Code des Codebuchstabens addiert */ ascii = ascii + codeascii ; /* Zieht die Differenz von Start und End-Zahl ab wenn die Zahl größer als die * End-Zahl ist. So wir die Zahl im Bereich der darstellbaren ASCII-Zeichen gehalten. */ for(i2=0; i2<2; i2++) { if(ascii > zmax) { ascii = ascii - (zmax - zmin); } } /* Buchstabe der sich aus dem errechneten ASCII-Code ergibt wird in die Variable für * die Ausgabedatei gespeichert. */ TextOut[i] = ascii ; } length = length + 1 ; //String wird durch einen "\0"-character abgeschlossen TextOut[length] = '\0' ; /* Der verschlüsselte Text wird zeilenweise in die Datei geschrieben. */ fputs(TextOut, output) ; /* Nach jeder Zeile wird ein Zeilenumbruch in die Datei geschrieben */ fprintf(output, "\n") ; } else returnf = 0 ; /* Wenn fgets ein "NULL" zurück gibt wird die Prüfvariabloe "returnf" * auf "0" gesetzt damit die Schleife beendet wird. */ } while(returnf != 0) ; } /* Funktion die die Quelldatei zeilenweise ausliest, entschlüsselt und zeilenweise * in die Zieldatei schreibt. * empfangene Übergabeparameter: * 1. Filepointer auf Quelldatei * 2. Filepointer auf Zieldatei * 3. Pointer auf String mit Codewort */ void decode(FILE * input, FILE * output, char * code) { /* Variable zum Zwischenspeichern des Dateiinhalts */ char TextIn[1026] ; /* Variable zum Zwischenspeichern der Ausgabe */ char TextOut[1026] ; /* Variable zum Zwischenspeichern der ASCII-Werte */ int ascii ; /* speichert Länge der eingelesenen Zeile */ int length ; /* Zählervariablen */ int i, i2 ; /* Variable für Länge des Codeworts */ int codelen ; /* Variable in der der ASCII-Code des Codewort-Zeichens gespeichert wird */ int codeascii ; /* Prüfvariable die auf "0" gesetzt wird wenn das Dateiende erreicht wurde */ int returnf ; /* ASCII-Bereich mit darstellbaren Zeichen */ int zmin = 32 ; int zmax = 126 ; /* Länge des Codeworts wird in "codelen" gespeichert */ codelen = strlen(code) ; codelen-- ; /* Deklaration der Strukturpointer */ struct vListe * ende ; struct vListe * temp ; struct vListe * neu ; /* erste Struktur mit dem letzten Buchstaben des Codeworts wird angelegt */ ende = (vListe*) malloc(sizeof(struct vListe)) ; ende->character = code[codelen] ; /* temporärer Pointer auf die letzte Liste */ temp = ende ; /* Die Schleife verkettet die Listen imt den einzelnen Buchstaben des Codeworts */ do{ codelen-- ; neu = (vListe*) malloc(sizeof(struct vListe)) ; neu->character = code[codelen] ; neu->next = temp ; temp = neu ; }while(codelen > 0) ; /* Setzt Pointer in der Liste des letzten Buchstabens auf die Adresse der * Liste des ersten Buchstabens. */ ende->next = temp ; /* Schleife die die Quelldatei zeilenweise verarbeitet und in die Ausagebdatei speichert */ do{ /* Prüft ob fgets eine weiter Zeile fehlerfrei einlesen konnte oder ob das Dateiende * erreicht wurde. */ if((fgets(TextIn, 1026, input)) != NULL) { /* Länge der eingelesenen Zeile wird bestimmt und in length gespeichert */ length = strlen(TextIn) ; length = length - 2 ; printf("\n%s", TextIn) ; /* Schleife die die ASCII-Codes der eingelesenen Zeile und des Codeworts zeichenweise * addiert. */ for(i=0; i < length ; i++) { /* Speichert den ASCII-Code des Input-Buchtabens [i] in "int ascii" */ /* int char */ ascii = TextIn[i] ; /* ASCII-Code des aktuellen Code-Buchstabens wird in "codeascii" gespeichert */ codeascii = neu->character ; /* springt in die nächste Liste (mit dem nächsten Buchstaben des Codeworts) */ neu = neu->next ; /* ASCII-Code des Input-Buchstabens wird mit ASCII-Code des Codebuchstabens addiert */ ascii = ascii - codeascii ; /* Zieht die Differenz von Start und End-Zahl ab wenn die Zahl größer als die * End-Zahl ist. So wir die Zahl im Bereich der darstellbaren ASCII-Zeichen gehalten. */ for(i2=0; i2<2; i2++) { if(ascii < zmin) { ascii = ascii + (zmax - zmin); } } /* Buchstabe der sich aus dem errechneten ASCII-Code ergibt wird in die Variable für * die Ausgabedatei gespeichert. */ TextOut[i] = ascii ; } /* String wird abgeschlossen */ TextOut[length] = '\0' ; /* Der verschlüsselte Text wird zeilenweise in die Datei geschrieben. */ fputs(TextOut, output) ; /* Nach jeder Zeile wird ein Zeilenumbruch in die Datei geschrieben */ fprintf(output, "\n") ; } else returnf = 0 ; /* Wenn fgets ein "NULL" zurück gibt wird die Prüfvariabloe "returnf" * auf "0" gesetzt damit die Schleife beendet wird. */ } while(returnf != 0) ; } /* Funktion zur Ausgabe des Logos */ void logo(void) { system("cls") ; // 10\/ 20\/ 30\/ 40\/ //12345678901234567890123456789012345678901234567 printf("\n\n\t\t - - - - - - - - - - - - - - - - - - - - - - - ") ; printf("\n\t\t| |") ; printf("\n\t\t| ASCII Crypt v1.0 |") ; printf("\n\t\t| |") ; printf("\n\t\t| for Windows |") ; printf("\n\t\t| |") ; printf("\n\t\t - - - - - - - - - - - - - - - - - - - - - - - ") ; } main() { /* Filepointer auf Quelldatei */ FILE * input ; /* Filepointer auf Ausgabedatei */ FILE * output ; /* Pfad der Quelldatei */ char inputPath[256] ; /* Pfad der Zieldatei */ char outputPath[256] ; /* Variable für Eingabe des Codeworts */ char code[20] ; /* Variable für J|N-Abfragen */ char choice ; /* Variable für Auswahl des Encode- oder Decode- Modes */ char mode ; /* Endlosschleife für Programmwiederholung */ do{ /* Hauptmenü für "goto" */ mainmenu: /* Logo-Ausgabe */ logo() ; /* Auswahl des (1)Encode- oder (2)Decode- Modes */ printf("\n\n\t\t\t(1) Verschluesseln\n\n\t\t\t(2) Entschluesseln\n\n\t\t\t(B) Beenden") ; printf("\n\nAuswahl: ") ; scanf(" %c", &mode) ; /* Prüft ob die Auswahl des Modes gültig ist */ if(mode != '1' && mode != '2' && mode != 'b' && mode != 'B') { logo() ; printf("\n\nDie Eingabe war unglueltig.") ; printf("\nPress any key to continue...") ; getch() ; goto mainmenu ; } else if(mode == 'b' || mode =='B') goto End ; /* Logo-Ausgabe */ logo() ; /* Pfad der Quelldatei wird eingegeben */ printf("\n\nGeben Sie den Pfad der Datei ein die verschluesselt/entschluesselt werden soll.\n") ; scanf(" %s", inputPath) ; /* Pfad der Zieldatei wird eingegeben */ printf("\n\nGeben Sie den Pfad der verschluesselten Datei ein die erstellt werden soll.\n") ; scanf(" %s", outputPath) ; /* Quelldatei wird geöffnet. Wenn ein Fehler auftritt, wird eine Fehlermeldung ausgegeben * und das Programm wird beendet. */ if((input = fopen (inputPath, "r+t")) == NULL) { printf("\nFEHLER: Datei konnte nicht geoeffnet werden.\n\n") ; /* Fehlermeldung */ printf("Press any key to continue...") ; getch() ; goto mainmenu ; } /* Es wird geprüft, ob die Zieldatei schon existiert.*/ if((input = fopen (outputPath, "r+t")) == NULL) {/* Wenn die Zieldatei noch nicht existiert... */ /* Es wird überprüftprüft, ob die Zieldatei erstellt wurde.*/ if((output = fopen (outputPath, "w+t")) == NULL) {/* Wennn die Zieldatei nicht erstellt werden konnte... */ /* Fehlermeldung wird ausgegeben und das Programm springt zum Hauptmenü */ printf("\nFEHLER: Datei konnte nicht erstellt werden.\n\n") ;//Fehlermeldung printf("Press any key to continue...") ; getch() ; goto mainmenu ; } } else {/* Wenn die Zieldatei bereits existiert... */ /* wird gefragt ob die existierende Datei überschrieben werden soll. */ printf("\nDie Datei %s existiert bereits.\nSoll die Datei ueberschriebene werden?<J|N>", outputPath) ; choice = getch() ; if(choice == 'j' || choice == 'J') {/* Wenn die Datei überschrieben werden soll... */ /* Es wird versucht die Datei zu überschreiben. */ if((output = fopen (outputPath, "w+t")) == NULL) {/* Wenn dies fehl schlägt... */ /* Fehlermeldung wird ausgegeben und das Programm springt zurück ins Hauptmenü*/ printf("\nFEHLER: Datei konnte nicht erstellt werden.\n\n") ;//Fehlermeldung printf("Press any key to continue...") ; getch() ; goto mainmenu ; } } else /* Wenn die Datei nicht überschrieben werden soll springt das Programm zurück ins Hauptmenü */ goto mainmenu ; } /* Eingabe des Codeworts */ printf("Geben Sie das Codewort ein: ") ; scanf("%s", code) ; /* Ruft abhängig von der Auswahl im Hauptmenü die Funktion für das Ver- oder Entschlüsseln auf */ if(mode == '1') { encode(input, output, &code[0]) ;} else decode(input, output, &code[0]) ; }while(true) ; /* Ende der Endlosschleife | springt immer wieder zurück ins Hauptmenü */ /* Wenn kein Fehler beim öffnen der Datei aufgetreten ist wird die Quelldatei geschlossen. */ if(input != NULL) fclose(input) ; /* Wenn kein Fehler beim öffnen der Datei aufgetreten ist wird die Ausgabedatei geschlossen. */ if(output != NULL) fclose(output) ; /* Endmarke für "goto" */ End: printf("\nDas Programm wurde beendet.\n") ; return(0) ; }
-
also die aenderung des file pointers auf variable dateinamen sollte nichts mit fgets zu tun haben
was genau passiert - ich hab keine lust mir das ganze durchzusehen
hast du dir schon angeschaut wie der pfad aussieht nachdem er ausgelesen istgomberl
-
Du musst dir ja nicht den ganzen Quellcode durchlesen.
Reicht der Teil in main() wenn der Pfad eingelesen wird, die Übergabe an die Funktion und da das fgets.
Ich werde gleich mal nachsehen was da in den Variablen steht.
EDIT:
Ich habe jetzt gerade festgestellt dass wenn ich die zu erstellende Datei vorher lösche, also nicht überschreibe, kommt folgende Fehlermeldung.Debug assertion failure
FILE: fgets.c
LINE: 60EXPRESSION: str != NULL
Kann damit vielleicht jemand was anfangen?
-
Ich weiß ja nicht wie du deinen Pfad eingibst, aber du denkst daran, daß der Baskslash in einem String eine Escape-sequenz einleitet und der der gewollte \ dann \\ geschrieben werden müßte, d.h.
c:\mypath\myfile.ext würde als c:ypathyfile.ext verstanden werden.
müßte also geschrieben werden:
c:\\mypath\\myfile.ext oder du ließt mit getche ein, prüfst auf '\' und schreibst zwei '\' in deinen string.