Zeiger wieder an den Anfang setzen???



  • was die überschrift betrifft bin ich mir nicht so sicher aber ich denke mal das es daran liegt, undzwar habe ich mir zwecks Übungzwecken gedachte eine Art Notizblock zu programmieren. ich kann wunderbar rein schreiben(löschen kommt vielleicht später mal dazu) und ich kann auch auslesen, jetzt ist des Problem nur das beim zweiten mal auslesen der teil des Befehls fürs lesen einen Fehler produziert.

    #include <iostream>
    #include <fstream>
    #include <cstdio>
    #include <string>
    using namespace std;
    
    int befehl = -1;
    string Speicher;
    ofstream DateiS;
    ifstream DateiL;
    string dateiname = "Speicher";
    
    void Lesen()
    {
      char zeichen;
    
        DateiL.open( dateiname.c_str(), ios_base::in );
        cout << "test"<< endl;
    
      if ( !DateiL )
      {
        cout << " Datei konnte nicht geöffnet werden!" << endl;
    
      }
    
      while ( !DateiL.eof() )
      {
        DateiL.get( zeichen );
        cout << zeichen;
      }
     DateiL.close();
    
    }
    
    void Schreiben( string a )
    {
      DateiS.open( dateiname.c_str(), ios_base::out | ios_base::app );
    
      if ( !DateiS )
      {
        cout << " Datei konnte nicht geöffnet werden!" << endl;
    
      }
      DateiS << a << endl;
    
      DateiS.close();
    }
    
    int main()
    {
      while ( befehl != 0 )
      {
        cout << endl;
        cout << "Menu :" << endl;
        cout << "Datenbank abrufen             <1>" << endl;
        cout << "In Datenbank schreiben        <2>" << endl;
        cout << "Beenden                       <0>" << endl;
        cout << endl;
        cout << "Ihre Eingabe : ";
        cin >> befehl;
        cout << endl;
    
        switch ( befehl )
        {
          case 0:
            cout << endl;
            cout << "Programm beenden" << endl;
    
          break;
    
          case 1:
            cout << endl;
            cout << "Speicher wird abgerufen..." << endl;
            Lesen();
            cout << endl;
            cout << "Speicher kompelett ausgelesen." << endl;
          break;
    
          case 2:
            cout << "Bitte geben sie den zu speichernden String ein : " << endl;
            cin >> Speicher;
            cout << endl;
            Schreiben( Speicher );
          break;
          default:
            cout << endl;
            cout << "Ungueltige Eingabe" << endl;
          break;
        }
        fflush( stdin );
        getchar();
    
      }
      return 0;
    }
    

    ich vermute mal das der Fehler in der lese Funktion sitzt bin mir aber nicht sicher. Suche den Fehler schon seit mindestens 2 Wochen in sämtlichen Bibliotheken meiner Umgebung.



  • Hallo

    verwende lokale variablen in den Funktionen, Übergabeparameter und Rückgabewerte anstatt der globalen Variablen.

    bis bald
    akari



  • wie wär's mit einem

    DateiL.seekg( 0, ios_base::beg );
    

    um den Dateizeiger auf den Anfang zu setzen?

    Greetz, Swordfish



  • hm...denke mal der Befehl so voll den close Befehl? getestet und selbes ergebnis

    @akari: bisher bin ich froh wenn ich einigerMassen durch blicke mit lokalen variablen beschäftige ich mich später, dürfte ja auf mein Problem keine Auswirkung haben.



  • wie wär's mit:

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <sstream>
    
    using namespace std;
    
    void wait_return( );
    
    int main()
    {
        int choice = 0;
    
        char filename[ _MAX_PATH + 1 ];
    
        cout << "Welche Datei möchten Sie benutzen?" << endl;
    
        do {
    
            cin.getline( filename, _MAX_PATH + 1, '\n' );
    
            if( cin.fail( ) ) {
    
                cout << endl << "Falsche Eingabe!" << endl;
                cin.clear( );
                cin.ignore( cin.rdbuf( )->in_avail( ) );
                wait_return( );
    
            } else {
    
                choice = 1;
            }
    
        } while( !choice );
    
        fstream file( filename, ios_base::out | ios_base::in );
    
        if( !file.is_open( ) ) {
    
            cout << "Die Datei \"" << filename << "\" konnte nicht geöffnet werden!" << endl;
            return 0;
        }
    
        do {
    
            cout << endl;
            cout << "Menu:" << endl;
            cout << "Datenbank abrufen             <1>" << endl;
            cout << "In Datenbank schreiben        <2>" << endl;
            cout << "Beenden                       <0>" << endl << endl;
            cout << "Ihre Auswahl: ";
            cin >> choice;
    
            if( cin.fail( ) ) {
    
                cout << endl << "Falsche Eingabe!" << endl;
                cin.clear( );
                cin.ignore( cin.rdbuf( )->in_avail( ) );
                wait_return( );
    
            } else {
    
                cout << endl;
                string data;
                char ch;
    
                switch( choice ) {
    
                    case 0:
                        break;
    
                    case 1:
    
                        cout << "Speicher wird abgerufen..." << endl << endl;
                        file.seekg( 0, ios_base::beg );
    
                        while( !file.eof( ) ) {
    
                            file.read( &ch, 1 );
                            cout << ch;
                        }
    
                        file.clear( );
                        cout << endl << "Speicher kompelett ausgelesen." << endl;
                        break;
    
                    case 2:
    
                        cout << "Bitte geben sie den zu speichernden String ein:" << endl;
                        cin >> data;
                        file << data << "\r\n";
                        break;
    
                    default:
    
                        cout << endl << "Falsche Eingabe!" << endl;
                        wait_return( );
                        break;
                }
            }
    
        } while( choice );
    
        file.close( );
    }
    
    void wait_return( )
    {
        cout << endl << "Drücken Sie Enter..." << endl;
        cin.clear( );
        cin.ignore( cin.rdbuf( )->in_avail( ) );
        cin.get( );
        cin.clear( );
        cin.ignore( cin.rdbuf( )->in_avail( ) );
    }
    

    Greetz, Swordfish



  • ok Swordfish danke erst mal der Quelltext funktioniert so weit (kann scheinbar keine Datei erstellen?!?)nur verstehen möchte ich auch gerne, weil ich ja sonst nichts lerne.(will mal besser nicht alles auflisten was ich nicht verstehe)Bei dem meiningen Quelltext fehlt doch lediglich irgendwo ein Befehl des alles wieder in die Ursprungs Position bringt? könntest du mir vieleicht(ignoriere doch bitte mal meine gansen globalen variablen) zeigen wo ich diesen einfügen muss? ich denke ja mal das es sich dabei um den von dir beim ersten Post beigesteuerten Befehlt handelt

    DateiL.seekg( 0, ios_base::beg );
    

Anmelden zum Antworten