finde den Fehler nicht...



  • Nabend die Herren,
    kann mir einer helfen? Ich bekomme immer die Fehlermeldung

    no match for 'operator>>' in 'fin >> reserv_mot[1].main()::d_reservierung::zeit'
    

    Ich habe das Programm unter Dev-C++, Visual C++ 2008 Express Edition und Visual C++ 2010 Express Edition probiert... In der Schule habe ich das Programm ohne Probleme ausgeführt bekommen (unter Visual C++ 2008 Professional) bzw. habe ich

    ifstream fin;
    ofstream fout;
    

    schon öfter benutzt... fout << funktioniert auch und wird ohne Probleme kompiliert.
    Hat jemand von euch einen Rat?

    Deklarationsteil:

    #include <iostream>
    #include <conio.h>
    #include <fstream>
    #include <iomanip>
    #include "conioex.h"
    #include <time.h>
    #include <ctime>
    #include <stdlib.h>
    
    using namespace std;
    
    cout << "Reservierungsmodul\n";
    	cout << "------------------\n\n";
    
    	ifstream fin;       //Dateioperationen deklarieren
    	ofstream fout;
    
    	itoa(jahrestag,temp,10);      //Variable "Jahrestag" in Char Konvertieren und in "temp" zwischenspeichern
    	strcat(temp, ".txt");         //Dateiendung ".txt" an "temp" anhängen
    	strcpy(filename_mot, "1_");   //1_ in die Variable "filename_mot" kopieren
    	strcat(filename_mot, temp);   //beide Dateinamenteile zusammenführen um fertigen Dateinamen zu generieren
    
    	fin.open(filename_mot);      //Datei zum Lesen öffnen
    
    	if(fin){
    		fin >> reserv_mot[1].zeit;
    	}
    
    	fin.close();	//Datei schließen
    

    Danke schonmal im Vorraus 🙂
    klee



  • Hier noch das deklarierte Struct:

    const int max_reserv = 14;		//Maximale Reservierungsanzahl (14 Tage im vorraus)
    
    	struct d_reservierung{
    		int zeit[24];
    	};
    	d_reservierung reserv_mot[max_reserv];
    


  • Die Variable zeit ist ein Array:

    int zeit[24];
    

    Und es ist kein Index angegeben:

    fin >> reserv_mot[1].zeit;
    

    Folglich weiß der Compiler nicht, wohin er den Wert schreiben soll. Wozu soll das Array gut sein?



  • Hmm aber der Arrayname ist ein Zeiger auf das erste Arrayelement. Müsste doch eigentlich klappen oder?

    Im Prinzip sollen in dem Array aus einer Textdatei kundennummern ausgelesen werden. Diese Kundennummern stehen in einer bestimmten Reihenfolge in der Textdatei und bestimmen somit welche der 24 Stunden bereits gebucht sind.

    Das ist ein Flugzeugverwaltungsprojekt aus dem ersten Lehrjahr als FISI.



  • Damit das "einfach so" klappt, müsstest du das ganze binär speichern. Alternativ kannst du jeden Array-Eintrag in einer Schleife einzeln einlesen.

    Übrigens hast du zwar mit dem Zeiger recht, aber damit du an das erste Element kommst, musst du den Zeiger dereferenzieren: fin >> *reserv_mot[1].zeit;

    Damit wäre aber nur zeit[0] befüllt. Alle anderen Einträge bleiben weiterhin uninitialisiert.



  • klee schrieb:

    Hmm aber der Arrayname ist ein Zeiger auf das erste Arrayelement.

    nein. Der Array-to-pointer decay dürfte hier nicht auftreten. uns selbst wenn, bist du dir sicher dass du einen Pointer aus der Datei lesen wills? Das darf doch bezweifelt werden. Solls nicht vielmehr der Inhalt sei, der hinter dem Pointer stecken soll?

    Du kommst wohl nicht drumrum, mit einer Schleife die 24 Werte aus der Datei zu lesen.
    Du könntest die Schleife allerdings wegkapseln, indem du op>> für den Typ d_reservierung überlädst.

    Noch ein paar Anmerkungen zu deinem Code:
    - <time.h> und <stdlib.h> sind C-Header, keine C++-Header. Die entsprechenden C++-Header heißen <ctime> und <cstdlib> - wovon du den ersten ja eh schon eingebunden hast.
    - in C++ kann man - anders als in C - Objekte genau da definieren, wo man sie auch braucht. Du könntest fin also direkt da definieren und initialisieren (d.h. öffnen) wo du ihn zum ersten mal verwendest.
    - schau dir mal std::string und ggf. stringstreams an, die erleichtern die Verarbeitung von Zeichenketten in vielen Fällen und du brauchst dich nicht mit strcat() & Co rumzuschlagen.
    - schau dir mal std::vector an, ggf. auch std::tr1::array (oder boost::array), das sind oft sinnvolle Alternativen zu C-Arrays. Vor allem entfallen bei vector solch willkürlichen magic numbers wie dein max_reserv .
    - denk dran cout zu flushen wenn du eine Ausgabe vollständig in den Stream geschrieben hast. Das geht z.B., indem du statt des letzten '\n' ein std::endl hineinschiebst.


Anmelden zum Antworten