Datei lesen/schreiben Übung Buchstaben ersetzen



  • Hi an alle,
    hab ein Problem bei folgender Übungsaufgabe und wollte fragen ob mir da jmd einen Tipp geben könnte (eher Tipp statt gleich ganze Lösung^^)

    Übung:
    Schreibe eine Funktion, welche eine Datei öffnet und deren Text wie folgt ändert. Fängt ein Wort mit einem Kleinbuchstaben an, so soll ein Großbuchstabe daraus gemacht werden. Beispiel: aus "Die schönen Dinge im Leben sind umsonst." wird "Die Schönen Dinge Im Leben Sind Umsonst.". Im Parameter wird lediglich der Dateipfad übergeben.

    int main() 
    {
    	FILE *fp;
    	int i,temp,tempt=0;
    
    	fp=fopen("dinge.txt","rw");
    
    	if(fp == NULL){
    		printf("Datei konnte nicht geoeffnet werden.\n");
    	}else{
    		while((temp = fgetc(fp))!=EOF) 
    		{
    			if(temp>='a' && temp <='z' && temp !=tempt)
    			{
    				tempt = temp;
    				temp-=32;
    			}
    			printf("%c",temp);
    		}
    		fclose(fp);
    	}
    
    	return 0;
    }
    

    Anmerkung: Das die Aufgabe behinhalted das ganze in eine seperate Funktion zu packen weiß ich aba das mach ich Anschluss, kleistes Problem.
    Problematik: Datei wird geöffnet, da ich auch buchstaben ersetzen möchte im rw modus.
    mit fgetc lese ich den ersten buchstaben in dieser Textdatei aus (darin ein Beispielsatz mit groß und klein Wörtern), dieser wird in temp gespeichert und durch if überprüft.
    Anfangs hatte ich es ohne das tempt probiert und es war kein problem alle kleinbuchstaben durch Großbuchstaben zu ersetzen oder umgekehrt.
    Aber ich finde keinen weg nur den Anfangsbuchstaben eines neuen Wortes zu ersetzen..
    mit der obigen tempt variante schaffe ich gerade mal das er doppelte buchstaben klein lässt was mir aber nicht viel hilft.
    Hatte auch schon einige varianten mit leerzeichenüberprüfung aber irgendwie hat keine geklappt bzw hab ich es nicht geschafft das er nach einem erfolgreich ersetzen buchstaben erst wieder ersetzt bis ein leerzeichen aufgetreten ist.

    Sry für die lange Erklärung, hoffe jmd kann mir da weiterhelfen. 🙂



  • #include <ctype.h>
    //...
    int whitespace_flag = 1;
    //...
    while((temp = fgetc(fp))!=EOF)
    {
        if(isalpha(temp) && whitespace_flag)
        {        
            // anfang eines neuen wortes 
        }
        whitespace_flag = isspace(temp);
    
    }
    


  • Bist du dir sicher, das der geänderte Text wieder in die Datei zurück geschrieben werden soll?

    Den Modus "rw" gibt es nicht.
    Wenn dann ist es "r+"
    Und die Handhabung ist nicht trivial.

    Zur Überprüfung auf bestimmte Zeichengruppen und zur Umwandlung in Groß-/Kleinbuchstaben gibt es in ctype.h hübsche Funktionen.



  • Hi, danke erstmal für die rasche Antwort "xxxx..."

    Jedoch kann ich damit leider kaum was anfangen 😕
    Bin gerade dabei mich mit ein zwei tutorials ins C programmieren einzulernen.
    Kurz ein Ausschnit aus dem Tutorial:

    Modus

    Beim Öffnen einer Datei stehen uns folgende Angaben zum Modus zur Verfügung:

    r, read, lesen
    w, write, schreiben
    a, append, anhängen
    b, binary, Binärmodus
    t, text, Textmodus

    Diese Angaben können auch kombiniert werden. So wird z.B. mit "rw" eine Datei zum Lesen und Schreiben geöffnet. Der append Modus ist auch ein Schreibmodus, nur dass die ursprünglichen Daten der Datei unverändert bleiben und die neuen Daten an das Ende der Datei angehängt werden.

    Daher auch der rw modus, und er funktioniert ja einwandfrei.

    Die Übung ist eine der ersten von diesem Tutorial im Thema Datenverarbeitung, dachte daher das ich einfach zu kompliziert denke und die relativ einfach zu lösen sein müsste mit den Dingen die bisher darin vorkamen (da gehört ctype.h nicht dazu) Oo



  • Dann schmeiss das Tutorial weg.
    Denn ob das funktioniert, kannst du mit dem Code nicht feststellen, da du nicht in die Datei schreibst.

    Es gibt die Modi r,w,a . Die kannst du mit b und/oder + kombinieren. Ein t gibt es nicht im Standard.

    (In der [url=Linkliste für Neulinge]http://www.c-plusplus.net/forum/300567[/url] hier im Unterforum, kannst du dir mal den C-Standard durchlesen)

    Zu dem Code von xx...x:
    Ein Wort beginnt nach einem Leerzeichen. Darum musst du dir merken, wenn du eins findest. Dazu benutzt du ein Flag (auch nur eine Variable) welches das anzeigt.



  • Raven2013 schrieb:

    Jedoch kann ich damit leider kaum was anfangen 😕

    warum nicht?

    die variable whitespace_flag speichert das vorkommen eines leerzeichens.
    das kein ein tabulator sein ein einfaches leerzeichen.
    http://de.wikipedia.org/wiki/Leerraum
    ob in der variable temp ein leerzeichen gespeichert ist überprüft die funktion isspace http://www.cplusplus.com/reference/cctype/isspace/?kw=isspace.
    die funktion isalpha http://www.cplusplus.com/reference/cctype/isalpha/ checkt, ob in der variable temp ein buchstabe gespeichert ist.
    die if-anweisung überprüft, ob in der variable temp ein buchstabe gespeichert ist und ob vorher ein leerzeichen eingelesen wurde.



  • x^y schrieb:

    die funktion isalpha http://www.cplusplus.com/reference/cctype/isalpha/ checkt, ob in der variable temp ein buchstabe gespeichert ist.
    die if-anweisung überprüft, ob in der variable temp ein buchstabe gespeichert ist und ob vorher ein leerzeichen eingelesen wurde.

    verstanden soweit,aber überprüft die if anweisung nicht einfach nur ein einzeln eingelesenes zeichen? und somit "ob dieses zeichen ein buchstabe ist UND ob dieses zeichen ein leerzeichen/tabulator ist"? wieso ist das eine überprüfung "ob davor ein leerzeichen war" wenn whiteflag nur eine leerzeichen variable ist?

    @dirkB: kannst du mir denn ein gutes online tutorial empfehlen?



  • Raven2013 schrieb:

    verstanden soweit,aber überprüft die if anweisung nicht einfach nur ein einzeln eingelesenes zeichen? und somit "ob dieses zeichen ein buchstabe ist UND ob dieses zeichen ein leerzeichen/tabulator ist"? wieso ist das eine überprüfung "ob davor ein leerzeichen war" wenn whiteflag nur eine leerzeichen variable ist?

    Beachte die Reihenfolge der Zuweisungen.
    Und das Zeichen kann nicht gleichzeitig ein Buchstabe und Leerzeichen sein.
    Also wenn es ein Buchstabe (oder Zahl oder ... jedenfalls kein Leerzeichen) ist, dann ergibt das whitespace_flag = isspace(temp); in Zeile 11 unwahr.
    Und dieser Wert gilt dann wieder (durch die Schleife) in Zeile 7. In temp steht dann aber schon das nächste Zeichen.
    Also wird in Zeile 7 das aktuelle Zeichen mit dem Zustand des vorhergehenden verglichen.

    Raven2013 schrieb:

    kannst du mir denn ein gutes online tutorial empfehlen?

    Nein.
    Irgendwie schließen sich gut und online aus.


Anmelden zum Antworten