Brauche dringend Hilfe.



  • Datei::Datei(name, type);
    Datei::Datei::readNumbers(n, zahl);
    

    Habt ihr schon gelernt wie man von einer Klasse eine Instanz erzeugt und eine Methode darauf anwendet?

    Datei datei(name, type);
    datei.readNumbers(n, zahl);
    

    🙂



  • so gehts, ist aber nicht schön.
    müsst ihr klassen benutzen ? ( damit hast du anscheinend noch leichte probleme 🙂 ) ohne ginge es viel kuerzer...

    ich haette das oeffnen der datei lieber in die lese methode gestellt.

    ausserdem hab ich noch eine public var fuer die anzahl der gelesenen zeichen definiert, sonst kriegst du beim auslesen des zahlen arrays speichermuell angezeigt.

    tipp:
    immer schoen fehler abfangen ( datei nicht vorhanden, array zu klein ) macht zwar etwas arbeit, erspart aber hinterher das dreifache an zeit fuer die fehlersuche...

    #include <iostream>
    #include <fstream>
    #include <string>
    using namespace std;
    
    enum filetype {IN, OUT};
    
    class Datei{
       private:
          string fname;
          fstream file;
       public:
          int anzahl;
    
          Datei(string name, filetype ftype){
          anzahl=0;
    
          if(ftype==0){
             file.open(name.c_str(), ios::in);
             if (!file.good()) {
                cout<<"datei "<<name<<" nicht da\n";
                system("pause");
                exit(1);
             }
          }else{
             file.open(name.c_str(), ios::out);
          }
       }
    
       int Datei::readNumbers(int n, int store[]){
          anzahl=0;
          while(!file.eof() ){
             file >> store[anzahl];
             cout << store[anzahl]<<", ";
             anzahl++;
             if (anzahl>=n){
                cout<<"zahlen speicher zu klein\n";
                system("pause");
                exit(1);
             }
          }      
          file.close();
          cout<<endl;
       }
       ~Datei(){
          cout<<" destruktor called ";
       }
    };
    
    int main(){
       int n=10;
       int x;
       int *zahl=new int[n];
    
       filetype type=IN;
       string name="test.txt";
    
       Datei Dat(name, type);
    
       Dat.readNumbers(n, zahl);
       cout<<"\ngelesen: \n";
       for(int i=0; i<Dat.anzahl; i++){
          cout << zahl[i] <<", ";
       }
       delete[] zahl;
       cout<<endl;
       system("pause");
       return 0;
    }
    


  • @kermit1:
    Danke, dass du dir so viel Arbeit gemacht hast, das alles zu schreiben, aber ich muss mich streng an die Aufgabenstellung halten.
    Die Aufgabe lautet:
    Definieren Sie eine Klasse Datei, die verwendet werden soll, um die Handhabung von tatsächlichen
    Dateien einfacher zu machen. Um verschiedene Dateitypen unterscheiden zu können, definieren Sie
    enum filetype {IN, OUT};
    Die Klasse enthält:
    1. Ein privates Feld fname für einen Dateinamen (verwenden Sie string).
    2. Ein privates Feld file für einen Stream (Datentyp fstream).
    3. Einen Konstruktor Datei(string name, filetype ftype). Nach dem Aufruf sollte fname die Zeichenkette aus name enthalten, und der Stream file sollte entweder zum Lesen (wenn ftype gleich IN ist) oder zum Schreiben (wenn ftype gleich OUT ist) offen sein. Hinweis: fstream.open muss mit char* aufgerufen werden.
    4. Einen Destruktor. Stellen Sie sicher, dass kein Stream offen bleibt.

    Soweit funktioniert alles, aber hier ist die zweite Augabe:
    Erweitern Sie Ihre Klasse um eine öffentliche Funktion
    int Datei::readNumbers(int n, int store []);
    die Zahlen aus dem Stream file liest, und diese in store speichert. Die Funktion soll alle Zahlen aus
    dem Stream lesen, wenn es weniger als n sind, sonst die n ersten. Der Rückgabewert soll der Anzahl der
    eingelesenen Zahlen entsprechen.
    Hinweis: Sie können annehmen, dass die Datei nur Ganzzahlen, separiert von Leerzeichen, enthält.
    Und damit habe ich Probleme.



  • Achja. Die Funktion an sich erzeugt keine Fehlermeldung, sondern der Aufruf der Funktion im main-Teil.



  • Meinen Beitrag gelesen? 🙂



  • @LordJaxom:
    Oh. so klappt es. Würdest du mir bitte erklären, warum das so geht und nicht so, wie ich es gemacht habe? In der Uni habe ich es so gelernt, wie ich es gemacht habe.



  • Hallo,
    ich versuchs mal zu erklären. Mit

    Datei datei(parameter1, parameter2);
    

    wird eine Instanz der Klasse erzeugt, indem der Konstruktor deiner Klasse aufgerufen wird und ihm die Parameter parameter1 und parameter2 übergeben werden, d.h. du hast dann ein Objekt mit dem Namen datei vom Typ Datei (also dem Klassennamen). Auf dieses Objekt kannst du jetzt Memberfunktionen der Klasse anwenden. Zum Beispiel eben readNumbers dazu musst du dem Compiler natürlich mitteilen auf welches Objekt du die Funktion anwenden willst. Deshalb

    datei.readnumbers(n, zahl);
    

    diese Funktion ruft jetzt readNumbers mit den Parametern n und zahl für die Instanz datei auf.

    Hoffe ich konnte ein wenig helfen.

    MfG



  • Danke. Das hat mir schon gut geholfen. Ich glaube, ich verstehe es jetzt.



  • Jetzt habe ich ein anderes Problem. Wie kann ich ein zweites mal auf datei zugreifen, nachdem ich es einmal mit "Datei datei(name, type);" aufgerufen habe? Mit "datei(name, type);" geht es nicht.



  • "datei" mit dem kleinen "d" ist ein Objekt Deiner Klasse Datei. Mit

    Datei datei("name", type);
    

    legst Du das Objekt an. Damit existiert es, und Du kannst es nicht noch einmal anlegen. Du kannst ein zweites Objekt vom Typ Datei (das mit dem grossen "d" ist der Typ) anlegen, dann wird auch der Konstruktor ein zweites Mal aufgerufen:

    Datei datei2("neuername", type);
    

    Das aber ist die Erzeugung, kein Zugriff. Ein Zugriff wäre z.B. der Aufruf der Methode

    datei.readNumbers(n, zahl);
    

    . Und zwar ein Zugriff auf das Objekt datei (mit dem Dateinamen "name"). Mit

    datei2.readNumbers(n, zahl);
    

    greifst Du auf das Objekt datei2 (mit dem Dateinamen "neuername") zu.

    Also: "Datei" ist ein Typ. Eine Beschreibung des Inhalts und der Verhaltensweisen einer Datei. "datei" und "datei2" sind Objekte des Typs Datei, sie repräsentieren zwei echte Dateien auf der Festplatte. readNumbers ist eine Methode, die auf ein solches Objekt angewendet werden kann und aus dieser physikalischen Datei Daten in das Objekt lädt.

    Datei::readNumbers(n, zahl); ist falsch weil kein Objekt existiert (der Compiler fragt sich "Ok, er möchte Zahlen aus einer Datei gelesen haben. Aber aus welcher Datei?")


Anmelden zum Antworten