/0 am Ende eines Strings in binär



  • Hallo Leute

    Ich möchte gerne eine Text-Datei binär auslesen. Die Zeichen durch ein besonderes System verschlüsseln und am ende in eine neue Datei reinschreiben. Soweit alles schön und gut klappt auch alles das Problem ist das dass Programm am Ende meiner Datei noch ein Zeichen mehr mit übernimmt.

    Dieses liegt garantiert an dem /0 das hinter einem String immer steht. Wie kann ich dieses Zeichen binär abfragen um den Fehler zu beseitigen?

    Gruß und Danke



  • Es ist \0 und in C++ kannst du '\0' verwenden.

    Du solltest aber eher den Fehler beim Abzählen der zu schreibenden Zeichen finden.



  • ich meinte natürlich auch \0 sorry!

    Ich programmiere das in c und nicht c++.

    das abzählen der zu schreibenden Zeichen ist nicht so einfach da man ja die länge einer x-beliebigen datei nicht kennt und diese nur als parameter übergeben wird.

    Demnach weiß ich ja nicht wie viele Zeichen in der Datei drin stehen


  • Mod

    cprog schrieb:

    Dieses liegt garantiert an dem /0 das hinter einem String immer steht. Wie kann ich dieses Zeichen binär abfragen um den Fehler zu beseitigen?

    Nein, das liegt garantiert daran, dass du aus irgendeinem schlechten Buch/Tutorial eine Schleife in der Form von

    while(!eof)
     {
       lesen();
       verarbeiten();
     }
    

    abgeschrieben hast. Das ist einfach von der Logik her falsch. Was passiert, wenn die Leseaktion schiefgeht? Dann verarbeitest du irgendwelchen Müll, da du den Erfolg (oder hier sogar nur eof - es kann schließlich noch was anderes schiefgehen) erst prüfst, wenn das Programm die Schleifenbedingung checkt. Es passiert also genau das, was du beschreibst.

    Eine Leseschleife in C++ (und allen ähnlichen Sprachen) sieht so (oder ähnlich) aus:

    while (lesen())
     {
       verarbeiten();
     }
    

    Hier nehme ich stillschweigend an, dass die lesen()-Funktion einen Rückgabewert hat, der entweder 0 (Misserfolg) oder ungleich 0 (Erfolg) ist, so wie es die allermeisten (aber nicht alle! Guck dir Referenzen an!) Lesefunktionen in der Standardbibliothek tun.

    P.S.: Falls diese Vermutung richtig ist, ist das übrigens ein sehr guter Grund für dich, dich von deinem Buch/Tutorial/Sonstwas zu trennen, bevor du daraus noch mehr Unsinn übernimmst.



  • Hmm ich poste mal den Code vielleicht kannst du mir dann gezielt sagen woran es liegt

    #define _CRT_SECURE_NO_WARNINGS // Beseitigen der Windowsspezifischen Warnung
    
    #include<stdio.h>
    #include<ctype.h>
    #include<stdlib.h>
    
    void Verarbeitung(FILE *inp, FILE *out, char* argv[]);
    
    void main(int argc ,char* argv[])
    {
    	int Fehlercode=0;
    	FILE *inp; //Zeiger auf Eingabe-Dateistrucktur
    	FILE *out; //Zeiger auf Ausgabe-Dateistrucktur
    
    	//Prüfen ob die Eingabe mit der Anzahl der erwarteten Parameter übereinstimmt
    	if(argc!=5) printf("Die Eingabe war nicht Korrekt!\n");
    
    	else
    	{
    
    		//Datei zum einlesen und ausgeben öffnen
    		inp=fopen(argv[1],"rt");
    		out=fopen(argv[2],"wt");
    
    		if(inp==NULL)Fehlercode=1;
    		else if(out==NULL)
    		{
    			//Eingabedatei im Fehlerfall schließen
    			fclose(inp);
    			Fehlercode=2;
    		}
    
    		else if(*argv[4]=='+'||*argv[4]=='-')Verarbeitung(inp,out,argv);
    		else Fehlercode=3;
    
    	}
    
    	if(Fehlercode==0)printf("Vielen Dank f\x81r die Benutzung des Programms!\n");
    	else if(Fehlercode==1)printf("Die Datei mit dem Namen %s \n konnte nicht geoeffnet werden!\n",argv[1]);
    	else if(Fehlercode==2)printf("Die Datei mit dem Namen %s \n konnte nicht geoeffnet werden!\n",argv[2]);
    	else if(Fehlercode==3)printf("Der Befehl zum Codieren oder Dekodieren ist nicht richtig!\n");
    }
    
    void Verarbeitung(FILE *inp, FILE *out, char* argv[])
    {
    	int i;
    	int shift=0; //Variable für Wert der aktuellen Verschiebung
    	int keyIndex=0;// Variable für aktuellen Index im Schlüsselwort
    	char Zeichen; // Variable zum abspeichern des aktuellen Zeichen
    
    	//Datei verarbeiten
    
    	while(!feof(inp))
    	{
    
    		if(*argv[3]=='\0')
    		{
    			for(i=keyIndex;i>0;i--)*argv[3]--;
    			keyIndex=0;
    		}
    
    		//Einlesen des aktuellen Zeichens
    
    		fread(&Zeichen,sizeof(char),1,inp);
    
    		if(Zeichen!=-1)
    		{
    
    			//Verschiebung festlegen
    			if(*argv[4]=='+')shift=(shift+*argv[3])%256;
    			else shift=(shift+256-*argv[3])%256;
    
    			//Verschiebung durchführen
    			Zeichen=Zeichen+shift;
    			if(Zeichen>255)Zeichen=Zeichen-256;
    			printf("%c", Zeichen);
    			fwrite(&Zeichen, sizeof(char),1,out);
    		}
    
    		*argv[3]++;
    		keyIndex++;
    	}
    
    }
    

  • Mod

    1. Das ist C
    2. while (!eof) ist auch in C falsch. Die einzige Sprache, wo das richtig ist, ist, wenn ich mich recht erinne, Pascal.
    3. Du machst genau das, was ich beschrieben habe in Zeile 55 ff.



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum C (C89, C99 und C11) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • ja ich weiß das ich das so mache das problem ist es ist durch den Prof so vorgegeben und bisher funktionierte es auch bei den anderen sachen nur jetzt muss ich halt diesen einen Fehler rausfiltern 😃


  • Mod

    cprog schrieb:

    ja ich weiß das ich das so mache das problem ist es ist durch den Prof so vorgegeben und bisher funktionierte es auch bei den anderen sachen nur jetzt muss ich halt diesen einen Fehler rausfiltern 😃

    Dann hast du keine Chance. Der Fehler liegt beim Prof. Das sagt dir sicherlich auch einiges über die Qualität des Kurses.


Anmelden zum Antworten