Wörter von Textdatei einlesen und verändern mit Arrays



  • HalliHallo

    Ich muss in der Schule ein Programm (c++) schreiben, welches eine vorgegebene Datei einliest.

    Bsp. mit dem Inhalt "Das ist ein Satz"

    Das Programm ändert dann den Satz bzw. jeden einzelnen Buchstaben durch einen anderen (a-z, b-y usw.)

    Wir haben das ganze schon mit einzelnen Buchstaben gemacht, nun aber mit Wörtern.

    #include <iostream>
    #include <fstream>
    #include <time.h>
    #include <windows.h>
    #include "ls.h"
    
    using namespace std;
    
    ifstream datUrsprung("H:\\Ursprung.txt", ios::in);
    ofstream datZiel("H:\\Ziel.txt", ios::out);
    
    int main()
    {
    LesenDatei();
    return 0;
    }
    
    void LesenDatei()
    {
    	int iPos = 0; // Buchstabenposition
    	char cZeichen;
    
    	while (datUrsprung.good()) // Liest Zeile bis zum Ende (EOF)
    	{
    		datUrsprung.seekg(iPos); // Buchstabenposition im Text
    	 	cZeichen = (char)datUrsprung.get();
    		if (datUrsprung.good())
    			SchreibenDatei(cZeichen);
    		iPos ++; // Buchstabenposition um 1 erhöht
    	}
    }
    
    char Ersetze(char cVon)
    {
    if(((int)cVon) > 96 && ((int)cVon < 123)) //kleinbuchstaben?
    {
    return char(122 - ((int)cVon - 97));
    }
    
    if(((int)cVon) > 64 && ((int)cVon < 91))//grossbuchstaben?
    {
    return char(90 - ((int)cVon - 65));
    }
    
    if(((int)cVon) > 47 && ((int)cVon < 58)) //zahl?
    {
    return char(57 - ((int)cVon - 48));
    }
    
    else
    {
    return cVon;
    }
    }
    
    void SchreibenDatei(char cZeichen) //Schreiben und Ausgabe
    {
    cout << Ersetze(cZeichen);
    datZiel << Ersetze(cZeichen);
    }
    

    WICHTIG: Es muss mit Arrays sein (also kein string gebrauchen)

    gruss

    Eldeon



  • Hallo,
    Habt ihr dieses Programm in der Schule geschrieben? Und sollt dieses nun so modifizieren, dass es Wortweise einließt? Wenn ja: Was hast du bisher versucht? Woran hängst du?

    Außerdem:

    1. Warum windows.h?
    2. Warum time.h?
    3. Warum ls.h?
    4. Warum verwendest du nicht std::isalpha() etc :)?

    Btw: Das Einlesen von Wörtern (unterschiedlicher Länge) ist - mit rohen char-Arrarys - kein Spaß...

    Caipi



  • Hu

    ja wir haben dieses Programm in der Schule geschrieben, btw. einen Teil davon.

    Windows.h und time.h hab ich hingeschrieben, weil ich was versucht habe. Habs vergessen wieder zu löschen 🤡

    Das "ls.h" ruft die verschiedenen Funktionen auf.

    Der Lehrer will es in Arrays sehen, die Lösung haben wir schon mit strings gemacht, aber naja ... 😕

    Mein Problem is, dass ich nich weiss, wie das Programm merkt, wann es ein Wort ist und dieses dann einliest, bzw. wie du schon sagstest, wieviele Buchstaben das Wort hat.

    Wenn das Programm es erstmal checkt, wann es ein Wort ist, dann hab ich n grossen Schritt gemacht (hoff ich mal), aber naja, hab bisher noch keine ordentliche Lösungsmöglichkeit gefunden.

    was is denn std::isalpha() etc. ? Hatten wir noch nie, und werden wir warscheinlich auch nie haben...

    Gruss Eldeon



  • Mal die C Funktionen:

    isalnum()  pruft auf alphanumerische Zeichen, es ist aquivalent zu (isalpha(c) || isdigit(c)).
    isalpha()  pruft  auf  Buchstaben,  in  der  standard  "C" Spracherweiterung ist es aquivalent zu (isupper(c) || islower(c)).  In anderen Spracherweiterungen konnen weitere Zeichen sein, fur die isalpha() wahr ist - Zeichen, die weder  GroB-  noch  Kleinbuchstaben sind.
    iscntrl()  pruft auf Kontrollzeichen.
    isdigit()  pruft auf Ziffern ab.
    isgraph()  pruft auf druckbare Zeichen auBer Leerzeichen ab.
    islower()  pruft, ob c ein Kleinbuchstabe ist.
    isprint()  pruft auf druckbare Zeichen inklusive Leerzeichen ab.
    ispunct()  pruft auf druckbare Zeichen, das kein Leerzeichen und kein alphanumerisches Zeichen ist.
    isspace()  pruft auf Freizeichen.  In den "C" and "POSIX" Spracherweiterung sind dies: Leerzeichen, Seitenvorschub ('\f'),  Zeilenumbruch ('\n'), Carriage Return ('\r'), Horizontaler Tabulator ('\t'), und verticaler Tabulator ('\v'). isupper()  pruft auf GroBbuchstaben ab.
    isxdigit() pruft, ob c eine hexadezimales Ziffer ist, also eine von 0 1 2 3 4 5 6 7 8 9 0 a b c d e f A B C D E F.
    

    In C++ ist das im std-namespace.

    Was du machst ist einfach so lange einzulesen, wie ein Buchstabe kommt.

    char* LesenDatei()
    {
        int iPos = 0; // Buchstabenposition
        char cZeichen;
        char Wort[100]; //Denk mal kein Wort ist länger als 100 Zeichen
        int wPos = 0; //Position des Zeichen im Wort
    
        while (datUrsprung.good()) // Liest Zeile bis zum Ende (EOF)
        {
            datUrsprung.seekg(iPos); // Buchstabenposition im Text
            cZeichen = (char)datUrsprung.get();
            if (isalpha(cZeichen)) { //Test ob es ein Buchstabe ist
              wort[wPos] = cZeichen;
              wPos++;
            } else {
              wort[wPos] = '\0'; // Daran erkennt man das Ende des Wortes
              if (datUrsprung.good()) SchreibenDatei(Wort);
              wPos = 0;
            }
            iPos ++; // Buchstabenposition um 1 erhöht
        }
    }
    

    Musst natürlich noch deine SchreibenDatei() ändern.


Anmelden zum Antworten