binäre Dateien auslesen, als .txt abspeichern und zurückwandeln



  • die überschrift spricht denke ich mal für sich, aber mein eigentliches problem ist da doch eher eine kleinigkeit. das auslesen, abspeichern und zurückwandeln funktioniert eigentlich mittlerweile schon recht gut, jedoch fügt er beim speichern als .txt das letzte byte immer doppelt ans dateiende ein und auch beim zurückwandeln wird es verdoppelt, sodass das ursprünglich letzte zeichen dann in der "zurückgewandelten" version in 3-facher ausführung vorhanden ist.
    ich kann mir jedoch nicht so richtig erklären wir das passiert.. naja genug der worte, hier die 2 relevanten funktionen:

    void dateiUmwandeln(){
    	FILE *puffer, *schreibpuffer;
    	char name[50];
    	char byte;
    
    	cout<<"Dateinamen eingeben: ";
    	cin>>name;
    
    	if(file_exist(name)){
    		puffer = fopen(name, "rb");
    		schreibpuffer = fopen("output.txt", "w");
    
    		while(!feof(puffer)){
    			fread(&byte, sizeof(char), 1, puffer);
    			fprintf(schreibpuffer, "%x", byte);
    		}
    
    		fclose(puffer);
    		fclose(schreibpuffer);
    	}
    	else cout<<"Datei existiert nicht!"<<endl;
    }
    
    void dateiWiederherstellen(){
    	FILE *puffer, *schreibpuffer;
    	char tmp[3];
    	tmp[2]='\0';
    	int hexzahl;
    
    	if(file_exist("output.txt")){
    		puffer = fopen("output.txt", "r");
    		schreibpuffer = fopen("recover.txt", "w");
    
    		while(!feof(puffer)){
    			fscanf(puffer, "%2c", tmp);
    			sscanf(tmp, "%x", &hexzahl);
    			fprintf(schreibpuffer, "%c", (char)hexzahl);
    		}
    
    		fclose(puffer);
    		fclose(schreibpuffer);
    	}
    	else cout<<"Datei existiert nicht!"<<endl;
    }
    

    falls ihr euch fragt wofür ich das brauche... ich spiele nur zu testzwecken mit dem gedanken binäre dateien hexadezimal als textdateien abzuspeichern. die textdatei kann dann ausgedruckt und bei bedarf wieder eingescannt und zurückkonvertiert werden. somit hätte ich quasi ein blatt papier als speichermedium.
    ist natürlich mit hexadezimalzahlen noch nicht so optimal, da ich damit auf eine seite höchst wahrscheinlich nur ein paar kb bekomme, aber das kann man ja später noch schön bunt machen etc.

    na dann hoffe ich mal auf eure hilfe, so far!



  • while(!feof(puffer)){
    			fread(&byte, sizeof(char), 1, puffer);
    			fprintf(schreibpuffer, "%x", byte);
    		}
    

    ich glaubem der ertkennt das dateiende erst, wenn das erste mal mist gelesen wurde.
    also eher so

    while(!feof(puffer)){
    			fread(&byte, sizeof(char), 1, puffer);
                               if(feof(puffer))
                                  break;
    			fprintf(schreibpuffer, "%x", byte);
    		}
    


  • super! vielen dank für die schnelle antwort.. genau das war mein fehler! ist aber auch bescheiden geregelt ;). nach zu viel programmieren hab ich dann doch ein paar brainlaggs...



  • Nordwin schrieb:

    super! vielen dank für die schnelle antwort.. genau das war mein fehler! ist aber auch bescheiden geregelt ;)...

    man kann sich zu Anfang die Dateigroesse holen und auf die beiden !feof(puffer) und feof(puffer) Funktionsaufrufe pro Byte verzichten...
    man kann die Datei komplett oder blockweise in einen Puffer schreiben, um das Tempo zu erhoeen,
    man kann diese Aufgabe eleganter mit der IOstream Library loesen.
    ... 😉


Anmelden zum Antworten