Datei inerhalb einer Klasse geöffnet lassen



  • hi!
    wir schreiben in der schule grade einen parser/compiler. angefangen haben wir zuerst mit relativ einfachen sachen (nur rechnen und syntaxkontrolle) nun wollen wir PL0 programmieren. bevor ich jedoch damit anfange, wollte ich überhaupt dateien bzw. den code aus einer textdatei einlesen. da ich vorhabe, die weitere programmierung in klassen zu machen, hier meine hauptklasse, in der die textdatei überhaupt eingelesen werden soll.

    class programm{
      public:
            programm(char * dateiname){
    		//nur damit mans besser lesen kann
    		for(int i=0; i<101;i++)datei_zeile[i]=-1;
    		//datei einlese
    		fstream code(dateiname,ios::in);
    		datei=&code;
    		if(!code){
    		   cout << 'F';
    		}
    		int actual_row = 1;
    		//nur platzhalter, damit man datei auslesen kann
    		string row_content = "";
                    int pos = 0;
    	        //position und zeilen feststellen
                    while(code && actual_row<100){
                   	   pos = code.tellg();
                       datei_zeile[actual_row]=pos;
    		   code >> row_content;
                       actual_row++;
            	}
            }
    
            void ausgabe(){
    		cout << "Ausgabe"<<endl;
    		string row_content = "";
                    //nur symbolisch
    	        int pos=datei_zeile[3];
    	        (*datei).seekg(pos);
    	        datei >> row_content; 
                    cout << row_content << endl;
            }
    
            ~programm(){
                    datei->close();
            }
      private:
            int datei_zeile[100];
            static int zeile;
            fstream *datei;
    };
    

    es liegt an der "verknüpfung" von datei und code. nur wie mach ich die richtig, bzw. wie frage ich "datei" in programm::ausgabe richtig ab?
    Randfrage, wie breche ich vernünftig ab, wenn das lesen der datei fehl schlug?

    Gruß
    marcus



  • Hallo

    Freeze2006 schrieb:

    Randfrage, wie breche ich vernünftig ab, wenn das lesen der datei fehl schlug?

    Gruß
    marcus

    Du könntest es mit "try" und "catch" probieren. Dazu folgender kurzer Beitrag:

    http://www.kharchi.de/

    chrische



  • Du könntest es mit "try" und "catch" probieren. Dazu folgender kurzer Beitrag:

    http://www.kharchi.de/

    chrische[/quote]
    Danke! das sieht sehr gut aus! werd ich mich morgen mal drum kümmern. wie siehts mit der datei aus?

    der sinn soll ja sein, dass man die zeile während des ablaufs weitersetzt und es sich damit erspart, den gesamten code vorher in eine oder mehrere variablen zu speichern.



  • mach das so, ohne zeiger:

    class Programm
    {
      Programm(const char* name): datei(name)
      {
      }
    
      ifstream datei;
    };
    


  • hi!
    ok, dass funktioniert bedingt, denn nach beenden des programms, erhalte ich ne zugriffsverletzung und es liegt am destruktor des fstreams.



  • Du arbeitest mit Daten, die dir nicht wirklich gehören und das ist immer gefährlich.

    Ein paar Beispiele:

    for(int i=0; i<101;i++)datei_zeile[i]=-1;
    

    datei_zeile hat nur 100 Elemente (0..99), also schreibst du über das Array-Ende hinaus.

    fstream code(dateiname,ios::in);
    datei=&code;
    

    code wird am Ende des Destruktors wieder geschlossen (und gelöscht), damit zeigt dein Dateizeiger ins Nirvana.

    (wozu du das statische Element "zeile" brauchst, ist mir übrigens nicht ganz klar)

    Richtig würde es z.B. so aussehen:
    [cpp]class Programm
    {
    public:
    Programm(char* name) : datei(name)
    {
    //hier landet die Initialisierung deines Zeilen-Arrays
    }

    //Destruktor brauchst du nicht, der automatisch generierte Dtor schließt auch die Datei

    private:
    ifstream datei;
    }



  • ok, danke!
    noch ne nachfrage dazu, ich mach es jetzt so, dass ich die datei öffters öffne, da der stream scheinbar nicht geöffnet bleibt.

    dazu nen bsp:
    [cpp]
    class Programm{
    public:
    get_line(fstream & datei){
    //..Ausgabe../
    }

    buffer(){
    fstream datei;
    datei.open("test.txt");
    get_line(datei);
    }
    }

    wieso erhalte ich nen linkerfehler beim aufruf von get_line?



  • Freeze2006 schrieb:

    ok, danke!
    noch ne nachfrage dazu, ich mach es jetzt so, dass ich die datei öffters öffne, da der stream scheinbar nicht geöffnet bleibt.

    dazu nen bsp:
    [cpp]
    class Programm{
    public:
    get_line(fstream & datei){
    //..Ausgabe../
    }

    buffer(){
    fstream datei;
    datei.open("test.txt");
    get_line(datei);
    }
    }

    wieso erhalte ich nen linkerfehler beim aufruf von get_line?

    Wie sieht denn die Fehlermeldung aus?

    mfg.



  • borland c++ builder 6 sagt dazu:

    [C++ Warnung] compiler.cpp(91): W8012 Vergleich von signed- und unsigned-Werten
    [Linker Fehler] Unresolved external 'programm::get_line(int, _STL::basic_fstream<char, _STL::char_traits<char> >&)' referenced from C:\DOKUMENTE UND EINSTELLUNGEN\MARCUS\EIGENE DATEIEN\C++\COMPILER_V0.01\COMPILER.OBJ
    


  • Dann schick mal die Funktion get_line rüber.

    mfg.



  • hi!
    sry, war irgendwo nen syntax fehler, hab nen bisle rumgespielt, und weg wars..
    also so funktionierts zumindest!

    THX!


Anmelden zum Antworten