Problem mit Dateien. Sie reagieren unerwartet beim Versuch sie zu öffnen.



  • Ich hab ein kleines Programm geschrieben, mein Problem damit:
    Wenn ich gleich am Anfang eine existierende Datei angebe läuft es so wie erwartet(Ausgabe: 0 0 0 1 1 "Hat alles geklappt.")
    Wenn ich aber am Anfang etwas falschen eingebe(also einen nicht existierenden Dateinamen), liefert mir das Programm dannach IMMER dieselbe Ausgabe, selbst wenn ich dann den richtigen Dateinamen eingebe. Warum?
    Hier die Fehlerausgabe:0 0 1 0 0 "Diese Datei lies...."

    Ich benutze übrigens Borland C++BuilderX, aber das ist hoffentlich nicht das Problem.
    Hier der Quelltext:

    #include <iostream>
    #include <fstream>
    #include <string>
    
    using namespace std;
    
    int main(int argc, char*argv[])
    {
      string Dateiname;
      cout << "Bitte geben sie den Namen inklusive Pfad der zu bearbeitende Datei an:" << endl;
      cin >> Dateiname;
      ifstream Datei(Dateiname.c_str(),ios::in);
      while(((Datei.fail()) || (!Datei.is_open()) || (!Datei.good())) && (Dateiname!="NEIN"))
      {
    cout << Datei.bad() << ' ' << Datei.eof() << ' ' << Datei.fail() << ' ' << Datei.good() << ' ' << Datei.is_open() << ' ' << endl;//DEBUG
        Datei.close();
        cout << "Die Datei lies sich nicht oeffnen oder existiert nicht! Bitte geben sie den" << endl;
        cout << "richtigen Namen inklusive Pfad der zu bearbeitende Datei an, " << endl;
        cout << "oder geben sie 'NEIN' ein, um abzubrechen:" << endl;
        cin >> Dateiname;
        ifstream Datei(Dateiname.c_str(),ios::in|ios::binary);
      }
      if(Dateiname=="NEIN")
      {
    cout << Datei.bad() << ' ' << Datei.eof() << ' ' << Datei.fail() << ' ' << Datei.good() << ' ' << Datei.is_open() << ' ' << endl;//DEBUG
        cout << "Programm wird beendet.";
        return 0;
      }
    cout << Datei.bad() << ' ' << Datei.eof() << ' ' << Datei.fail() << ' ' << Datei.good() << ' ' << Datei.is_open() << ' ' << endl;//DEBUG
      Datei.close();
      cout << "Hat alles geklappt.";
      return 0;
    }
    

    Ich bin übrigens auch für nicht zum Problem gehörige Verbesserungsvorschläge jeder Art offen.



  • Mittlerweile weis ich, dass es wahrscheinlich daran liegt, das durch

    ifstream Datei(Dateiname.c_str(),ios::in);
    

    Datei für immer mit dem Inhalt von Dateiname verknüpft wird. Und ein erneutes

    ifstream Datei(Dateiname.c_str(),ios::in); //Diesmal mit anderem Dateinamen
    

    Datei neu Definiert würde, was natürlich nicht zulässig ist. Auch die tatsache, dass ich jedesmal dazwischen

    Datei.close();
    

    aufrufe, scheint dies nicht zu ändern.

    Was kann ich da tun, dass der Benutzer den Dateinamen korrigieren kann, wenn er falsch ist? Das sollte doch machbar sein.



  • Genau das wollte ich grad schreiben 😃



  • Vor lauter Verzweiflung hab ich mal im Internet gesucht und etwas gefunden, was mir helfen könnte.
    fopen zum öffnen, fread zum lesen und fwrite zum schreiben und dann noch fputs und fgets.
    Als Beispiel wird angegeben:

    #include <stdio.h>
    
    int main () {
      FILE *f;
      char s[256];
      f = fopen ("test.cpp", "rt");
      while (fgets (s, 256, f))
        fputs (s, stdout);
      fclose (f);
      return 0;
    }
    

    Wo liegt der Unterschied zur Benutzung von ifstream und ofstream? Das scheint doch ein ganz anderer Ansatz zu sein! Das verwirrt mich doch sehr... 😕



  • fstream -> c++
    fopen etc. -> c



  • Es war aber ein C++ Kurs:
    http://www.home.unix-ag.org/martin/c++.ring.buch.html

    Und wie löse ich mein Problem mit C++? Ich persönlich finde zwar die C Lösung besser, aber ich will ja C++ benutzen.
    😕

    edit.: Das war extra als C angegeben, da ich aber nur mit Suchen gesucht und dann direkt dorthin gesprungen bin, hab ich dass nicht bemerkt.

    ENTSCHULDIGUNG!

    Aber die Frage bleibt offen:

    Wie löse ich mein Problem mit C++?



  • Hi,

    statt jedes mal ein neues Object zu erzeugen, brauchst du nur einmal

    ifstream datei...
    

    und wenn du eine neue Datei öffnen willst, dann mit

    datei.open(dateiname)
    

    grüße, Con@n



  • DANKE!!!!
    👍

    DEIN NAME SEI GEHEILIGT!!!!
    Endlich eine brauchbare antwort.

    DANKE!!!!


Anmelden zum Antworten