Datei lesen, darin ersten Wert vergleichen und bei Gleichheit 2 weitere Werte in double umwandeln



  • Hallo,
    ich habe nach einiger Suche noch keinen konkreten Weg gefunden, um folgendes zu erreichen:
    Es soll ein std::string Text über eine Methode in der Datei "navdata.txt" gesucht werden (1. Wert der TXT-Datei). Wird dieser zu vergleichende Wert gefunden, soll (mit je einem Leerzeichen getrennt) der 2. und 3. Wert ausgelesen werden und jeweils in eine double-Variable umgewandelt werden. Wie man einen einzelnen std::string in ein double ändert, weiß ich. Nach dem Auslesen dieser 3 Werte sollte die Datei geschlossen werden: file.close();
    Die Textdatei sieht nach folgenden Muster aus und wird später um die 200-300 Zeilen beinhalten:

    DF139 50.056867 8.637
    DF146 50.100339 8.634053
    ODAGA 50.326689 8.618878
    

    Der Code für den Lesevorgang würde ich in etwa so schreiben:

    std::ifstream file;
    file.open(":/MainWindow/navdata.txt", std::ios::in);
    bool abbrechen = false;
    while (!file.eof() && !abbrechen)
    {
        getline(file, foundname);
        if (foundname == searchforname) { abbrechen = true; }
        if (abbrechen)
            {
            //wie weiter verfahren???
            }
    }
    file.close();
    

    Wie könnte eine Lösung dazu aussehen?


  • Mod

    Würde ich völlig anders aufziehen. Aber das wichtigste: Du machst den großen Fehler, vorher etwas zu prüfen (eof), dann etwas zu tun (getline) und ungeprüft das Ergebnis zu verarbeiten. Das ist logisch falsch. eof kann nicht in die Zukunft gucken. Ebenso jede andere Art von Prüfung, die du dir ausdenken kannst. Du musst immer einfach das tun, was du tun wolltest; dann prüfen, ob es geklappt hat (getline und alle anderen Lesefunktionen haben Rückgabewerte dafür); dann kannst du das Ergebnis bei Erfolg verarbeiten.

    In dem Sinne könnte das ungefähr so aussehen:

    string word;
    double value1, value2;
    bool found = false;
    ifstream file("deine datei");  // open einfach indirekt im Konstruktor
    
    while(file >> word >> value1 >> value2)  // Solange  Rückgabe der Leseaktion Erfolg anzeigt
    {
      // Jetzt können wir sicher sein, dass die Leseaktion erfolgreich war und wir keinen Blödsinn verarbeiten
      if (word == "wonach du suchst")
      {
        found = true;
        break;
      }
    }
    
    if (found)
        cout << "Werte sind " << value1 << ' ' << value2;
    else:
       cout << "wonach du suchst nicht in Datei";
    
    // file zu schließen können wir uns auch sparen, das passiert automatisch, wenn der Gültigkeitsbereich von file verlassen wird
    


  • @SeppJ sagte in Datei lesen, darin ersten Wert vergleichen und bei Gleichheit 2 weitere Werte in double umwandeln:

    Würde ich völlig anders aufziehen. Aber das wichtigste: Du machst den großen Fehler, vorher etwas zu prüfen (eof), dann etwas zu tun (getline) und ungeprüft das Ergebnis zu verarbeiten. Das ist logisch falsch. eof kann nicht in die Zukunft gucken. Ebenso jede andere Art von Prüfung, die du dir ausdenken kannst. Du musst immer einfach das tun, was du tun wolltest; dann prüfen, ob es geklappt hat (getline und alle anderen Lesefunktionen haben Rückgabewerte dafür); dann kannst du das Ergebnis bei Erfolg verarbeiten.

    Vielleicht sollte an noch unterstreichen, dass der Grund dafür ist, das das eof-Bit nur nach einem wegen Dateiende fehlgeschlagenen Leseversuch gesetzt wird und nicht nachdem man das letzte Byte der Datei (erfolgreich) gelesen hat ("nicht in die Zukunft schauen"). Ausserdem gibt es noch einige andere Gründe, weshalb ein Dateisystem-Lesevorgang schiefgehen kann, nicht nur eof.

    Ich erwähne das nur, weil sich das für mich etwas zu allgemein las. Bei einer verketteten Liste prüft man ja z.B. durchaus zuerst den next-Pointer und liest dann einfach den Knoten, der da dran hängt 🙂



  • Dankeschön, es funktioniert jetzt alles wie gewünscht! Schöne Feiertage allerseits!



  • @Finnegan sagte in Datei lesen, darin ersten Wert vergleichen und bei Gleichheit 2 weitere Werte in double umwandeln:

    Vielleicht sollte an noch unterstreichen, dass der Grund dafür ist, das das eof-Bit nur nach einem wegen Dateiende fehlgeschlagenen Leseversuch gesetzt wird und nicht nachdem man das letzte Byte der Datei (erfolgreich) gelesen hat ("nicht in die Zukunft schauen").

    Vermutlich sollte man auch noch erwähnen dass ein "File" nicht nur ein File sein kann, sondern auch mit sowas wie einer Konsole oder einer Pipe verbunden sein kann (und auch noch anderen Sachen).

    Da kann man nach dem Lesen eines Zeichens u.U. noch gar nicht wissen ob es noch ein weiteres geben kann. Bzw. selbst bei Files geht das nicht immer. Das File könnte ja gleichzeitig von einem 2. Programm modifiziert werden. In dem Fall kann man dann ein Bytes lesen welches zu dem Zeitpunkt das letzte ist, doch wenn man dann später versucht nochmal eins zu lesen, dann klappt es wieder - weil in der Zwischenzeit Daten angehängt wurden.


Log in to reply