ifstream leere Datei erkennen?



  • Hallo,

    ich habe folgendes gemacht

    void Klasse::ReadEtwas()
    {
      std::ifstream fs("C:\\Path\\file.dat");
      if(fs.is_open())
      {
        vec.clear();  // std::vector<object> Membervariable von Klasse
        while(fs.good())
        {
          object b;
          fs >> b;
          vec.push_back(b);
        }
      }
    }
    

    Das funktioniert auch wenn in der Datei etwas drin steht oder die Datei nicht existiert.
    Wie erkenne ich aber das die Datei nicht die erwarteten Daten enthält, sprich leer ist?



  • Hi,
    das musst DU nicht erkennen, das erkennt C++ für dich. Vorausgesetzt, du liest richtig, was momentan nicht der Fall ist. Du musst
    1. Lesen
    2. Prüfen ob Lesen erfolgreich war
    3. Verarbeiten

    Du hast Punkt 1 und 2 vertauscht. Wenn dus nun richtig abänderst, braucht dich nicht mehr zu interessieren, ob die Datei leer ist.



  • Danke das hat mir geholfen, jetzt sieht es so aus:

    void Klasse::ReadEtwas()
    {
      std::ifstream fs("C:\\Path\\file.dat");
      if(fs.is_open())
      {
        vec.clear();  // std::vector<object> Membervariable von Klasse
        while(fs.good())
        {
          object b;
          fs >> b;
          if(fs.good())
            vec.push_back(b);
        }
      }
    }
    

    und tut was es soll.



  • ...



  • andreasgeorg schrieb:

    Danke das hat mir geholfen, jetzt sieht es so aus:

    void Klasse::ReadEtwas()
    {
      std::ifstream fs("C:\\Path\\file.dat");
      if(fs.is_open())
      {
        vec.clear();  // std::vector<object> Membervariable von Klasse
        while(fs.good())
        {
          object b;
          fs >> b;
          if(fs.good())
            vec.push_back(b);
        }
      }
    }
    

    und tut was es soll.

    Besser:

    void Klasse::ReadEtwas()
    {
      std::ifstream fs("C:\\Path\\file.dat");
      if(!fs)
        return;
      vec.clear();  // std::vector<object> Membervariable von Klasse
      object b;
      while(fs >> b) // operator >> liefert den Stream zurück, den kann man auf succes prüfen
          vec.push_back(b);
    }
    


  • andreasgeorg schrieb:

    Danke das hat mir geholfen, jetzt sieht es so aus:

    void Klasse::ReadEtwas()
    {
      std::ifstream fs("C:\\Path\\file.dat");
      if(fs.is_open())
      {
        vec.clear();  // std::vector<object> Membervariable von Klasse
        while(fs.good())
        {
          object b;
          fs >> b;
          if(fs.good())
            vec.push_back(b);
        }
      }
    }
    

    und tut was es soll.

    Schon besser. Aber es geht nochmals besser:

    void Klasse::ReadEtwas()
    {
      std::ifstream fs("C:\\Path\\file.dat");
      if(fs.is_open())
      {
        vec.clear();  // std::vector<object> Membervariable von Klasse
        for(object b; fs>>b; vec.push_back(b))
      }
    }
    


  • Ist ein Traum mit Euch.

    Das ich fs>>b so schön auswerten kann wußte ich nicht.


Anmelden zum Antworten