Frage: Dateioperationen



  • Hallo Leute,

    habe wieder ein kleines Problem.
    Habe für die anstehenden Klausur geübt und bin auf folgende Aufgabe gestossen:

    Wir sollen ein Programm schreiben, was eine Datei mit beliebigem Namen einliest.
    Dann eine Datei mit beliebigem Namen schreibt und den gesamten Text aus Datei1 übernimmt.
    Vorher wird der Nutzer aber aufgefordert einen Buchstaben einzugeben.
    Dieser Buchstabe wird dann im Inhalt, welcher in Datei2 übertragen wurde gesucht und durch ein '?' ersetzt.

    Ich habe das Programm soweit fertig allerdings habe ich ein Problem.
    In der Aufgabe steht, dass nur a-z und A-Z als Buchstaben angenommen werden dürfen.
    Sollte ein unzulässiger Buchstabe eingegeben werden (z.B. ä,ü,ö,#,2,... also Umlaute Zahlen und Zeichen), soll der Nutzer einfach nochmal aufgefordert werden einen neuen Buchstaben einzugeben, solange, bis ein zulässiger Buchstabe eingegeben wird.

    Hier mein Programm:

    #include <iostream>
    #include<fstream>
    using namespace std;
    
    int main (void) {
    
    	ifstream einlesen;
    	ofstream schreiben;
    
    	char datei1[200], datei2[200], zeichen, wort;
    
    	cout << "Einlesen: Dateiname = ? "; cin >> datei1;
    	einlesen.open(datei1, ios::in|ios::binary);
    
    	cout << "Schreiben: Dateiname = ? "; cin >> datei2;
    	schreiben.open(datei2, ios::out|ios::binary);
    
    	do{  // ich habe eigentlich hier statt der do-while ein "for (;;){...} stehen gehabt. allerdings bin ich davon ausgegangen, dass ich eine do while machen muss um die Buchstaben auf zulässigkeit zu überprüfen.
    	 cout << "Welcher Buchstabe soll durch '?' ersetzt werden? (a-z, A-Z) "; 
    		cin >> wort;
    		zeichen=(char)einlesen.get();
    		if(!einlesen.eof()) {
    			if (zeichen == wort) 
    				schreiben.put('?');
    			else
    				schreiben.put(zeichen);
    		}
    	else
    		break;
    	}
    	while (********************);  // Ich habe keinen Schimmer was hier rein muss um die Buchstaben-eingabe auf Richtigkeit zu kontrollieren...
    
    	cout << "\n\n";
    	einlesen.close();
    	schreiben.close();
    	return 0;
    
    }
    

    Ich hoffe ihr könnt mir helfen. Die Klausur ist am Dienstag und ich würde sehr gerne wissen, wie das Programm mit der letzten "Kleinigkeit" läuft.

    Danke schonmal 🙂



  • Du willst also bei jedem einzelnen zu kopierenden Zeichen den Benutzer nach einem Ersatz fragen?



  • Nein. Ich werde einmal gefragt um einen Buchstaben. Zum Beispiel gebe ich dann 'e' ein. Das programm geht dann jedes Zeichen in der textdatei durch und guckt ob es sich um ein 'e' handelt. Wenn ja ersetzt es dieses Zeichen durch ein '?'. Gebe ich jedoch statt einem normalen Buchstaben Beispielsweise einen Umlaut oder ein Zeichen ein, so gilt dieses als unzulässig und ich werde nochmal gefragt um ein neues Zeichen einzugeben. Das solange bis ich ein zulässigen Buchstaben eingegeben habe.



  • Das was du beschreibst, entspricht aber nicht dem gezeigten Source-Code.



  • Zum Testen auf Buchstaben kannst du isalpha nehmen. (wenn du nicht an locale rumgespielt hast)



  • Also Leute,
    ich verstehe eure Bemühungen mir Alternativen vorzuschlagen. Darum geht es mir aber nicht. wir sollten das Programm mit den bisher gelernten Befehlen etc. auf die Beine stellen.
    Bisher hatte ich diesen Code:

    #include <iostream>
    #include <fstream>
    #include <string>
    using namespace std;
    
    int main (void) {
    
    	ifstream einlesen;
    	ofstream schreiben;
    
    	char datei1[100], datei2[100], zeichen, wort;
    
    	cout << "Einlesen: Dateiname = ? " ; cin >> datei1;
    	einlesen.open(datei1, ios::in|ios::binary);
    
    	cout << "Schreiben: Dateiname = ? "; cin >> datei2;
    	schreiben.open(datei2, ios::out|ios::binary);
    
    	cout << "Welcher Buchstabe soll durch '?' ersetzt werden?  "; 
    	cin>>wort;
    
    	for(;;) {
    
    		zeichen=(char)einlesen.get();
    		if (!einlesen.eof()){
    			if ( zeichen == wort)
    				schreiben.put('?');
    			else
    				schreiben.put(zeichen);
    		}
    		else 
    			break;
    		}
    
    	cout << "\n\n";
    	einlesen.close();
    	schreiben.close();
    
    	return 0;
    }
    

    So lief es auch einwandfrei bis auf den Punkt, dass wenn die Aufforderung kommt: "Welcher Buchstabe soll durch '?' ersetzt werden? ", wenn ich da zum Beispiel ein "ü" oder ein "#" eingebe, der dann die txt datei auf diese Zeichen durchsucht und gegebenenfalls dann durch ein "?" ersetzt.
    Das soll er aber nicht.
    Er soll das nur für die Zugelassenen Zeichen (Groß-Kleinbuchstaben von a-z) durchführen.
    Kommt ein unzulässiges Zeichen auf, so soll er einfach die Aufforderung "Welcher Buchstabe soll durch...." wieder ausgeben, sodass ich ein neues zeichen eingebe.
    Dies wiederholt sich so lange, bis ich wieder ein zulässiges zeichen eingegeben habe.

    Nun ist es so, dass der Code den ich in diesem Beitrag gepostet habe mit einer For Schleife ohne Argumenten läuft. Das ist denke ich nicht der richtige weg zu meinem Problem.
    Ich gehe mal davon aus, dass die Eingabe Aufforderung zu erst mit in die Schleife muss und das ganze dann durch eine do-while Schleife umschlossen wird.
    Nun mein Problem: Was kommt dann in die While Bedingung, um meine Eingaben auf Richtigkeit zu kontrollieren??

    ich brauche die Lösung oder einen Ansatz sehr dringend, da die Klausur schon morgen ist und diese Aufgabe Klausurrelevant ist.

    Ich hoffe ihr könnt mir helfen.

    Danke im Voraus nochmal
    🙂 🙂



  • Hallo,

    so wie ich die Aufgabe verstehe, geht es darum, daß du bei der Benutzereingabe des zu ersetzenden Zeichen (bei dir die Variable 'wort'!?) überprüfen sollst, daß hier nur Buchstaben eingegeben werden sollen (d.h. hier mußt du eine Schleife herum basteln).
    Also ganz klar Trennung zweier Aufgaben: zuerst Eingabe(n) validieren, dann die Berechnung durchführen!

    Also noch mal klargestellt:
    nicht zwei ineinander verschachtelte Schleifen, sondern zwei Schleifen nacheinander!


Anmelden zum Antworten