[fixed-while-writing_but-read]while schleife bleibt stehen !?



  • Hi all... jetzt mal ganz ehrlich... Ist mein Programm besoffen?:

    int __cryptography_cryptingTextFile( FILE *file, char *key, int *state )
    	//Diese Funktion ver- und entschlüsselt die Datei auf die file zeigt. key wird als verschlüsselungs-Hilfe genommen.
    	//Returnwert: Die anzahl der geschriebenen Bytes
    	{
    		char *buf;
    		buf = malloc( sizeof(char) * ( READSIZEcrypt + 10 ) );
    
    		int textPos = 0,
    			keyPos = 0,
    			zahl = 0,
    			end = 0,
    			read = 0,
    			keyLen = 0,
    			geschrieben = 0;
    
    		long endOfFile = 0;
    
    		keyLen = strlen( key )-1;
    
    		*state = cTF_STATE_ERR;
    
    		fseek( file, 0, SEEK_END );
    		endOfFile = ftell( file );
    		fseek( file, 0, SEEK_SET );
    
    		//solange das Ende der Datei nicht erreicht wurde UND kein fehler aufgetreten ist
    		while( ftell( file ) < endOfFile && 0 == end )
    		{
    			memset( buf, '\0', READSIZEcrypt );
    
    			read = fread( buf, sizeof(char), READSIZEcrypt, file );
    
    			textPos = 0;
    
    			//Es wird solange verschlüsselt solange das Stringende nicht erreicht ist,
    			//die maximal zu lesende anzahl an chars nicht erreicht ist,
    			//das Ende des Strings nicht erreicht wird\\
    			//und das gelesene Zeichen nicht NULL ist (wird beim verschlüsseln -warum auch immer- angehängt)\\
    			do
    			{
    				//Ver- und Entschlüsseln
    				buf[textPos] = buf[textPos] ^ key[keyPos];
    
    				//Da der schlüssel oft kürzer als der zu verschlüsselnde Text ist, muss der schlüssel wiederholt werden
    				if( keyLen == keyPos )
    					keyPos = 0;
    				else
    					keyPos++;
    
    				textPos += 1;
    				printf( "%d\n", textPos );
    			}while( textPos < read );
    			//Wenn nicht alle einzulesenden Zeichen eingelesen wurden und die Datei nicht am Ende angelangt ist,
    			//ist ein Fehler aufgetreten
    			if( textPos < READSIZEcrypt && ftell( file ) < endOfFile )
    			{
    				end = 1;
    				*state = cTF_CANT_READ_ALL;
    			}
    			//Wenn nicht alle einzulesenden Zeichen eingelesen wurden und das Dateiende erreicht wurde,
    			//ist das Verschlüsseln erfolgreich abgeschlossen
    			else if( textPos <= READSIZEcrypt && feof( file ) )
    				*state = cTF_READ_ALL;
    
    			fseek( file, zahl, SEEK_SET );
    			geschrieben = fwrite( buf, sizeof(char), read, file );
    
    			zahl += geschrieben;
    		}
    
    		fseek( file, 0, 0 );
    		geschrieben = 0;
    
    		while( EOF != fgetc( file ) )
    			geschrieben++;
    
    		printf( "\n\n%d\n\n", geschrieben );
    
    		free( buf );
    
    		return zahl;
    	}
    

    Diesen schnippsel habt ihr bestimmt schon in einem meiner Posts gesehen, aber hier geht es lediglich um Zeile 39-52...

    DIESES FORUM IS SOOOOO GEIL...

    Notepad++ hat in Zeile 39 mit dem Synthax-Highlighting versagt...
    "\" bewirkt wohl, dass die nächste Zeile auch Kommentar ist, Notepad++ zeigte alles als normal an...

    Klar dass diese Konstellation nicht funktioniert...

    DANKE



  • Wenn du dir den Quelltext hier ansiehst, erkennt man den Fehler - du hast versehentlich das "do" auskommentiert und dadurch wird aus der do-while-Schleife eine alleinstehende Verbundanweisung und eine leere while-Schleife.

    Und der Punkt ist tatsächlich das \ am Ende der vorigen Zeile - das weist den Präprozessor an, die hintereinanderstehenden Zeilen zu einer zusammenzufassen, bevor er sie weiter auswertet. Sowas ist nütlich in Präprozessor-Direktiven (#define endet mit dem Zeilenende, das wird recht schnell unübersichtlich), ungefährlich in normalem C Code (dem Compiler ist die Zeilenstruktur egal) - und wie du bemerkt hast, gefährlich im Zusammenspiel mit Kommentaren.



  • Naja mein Ausbilder und ich saßen vor diesem Codeschnippsel (do war blau, also typisch für eine whil, do while oder sonstwas schleife) und kamen nicht drauf...
    Dann wollte ich hier schreiben, vlt seht ihr als unbeteiligte was...

    Tja hat auch in gewisser maßen funktioniert. 🕶


Anmelden zum Antworten