Problem: Datei einlesen und Werte zurückgeben



  • Hallo,

    ich möchte gerne folgendes machen:

    Ich habe mehrere Dateien, die eingelesen werden sollen. Die Dateien enthalten Variablen, mit denen anschließend weiter gerechnet werden soll.

    Dafür habe ich in der Klasse "test" eine allgemeine read-Funktion zur Verfügung, die alle Dateien einfach nur einliest, sowie eine find-Funktion, die mir anhand eines Schlüsselwortes den jeweiligen Wert zurückgibt.
    Früher waren die read- und die find-Funktion in einer zusammengefasst, jetzt wollte ich die Funktionen aber aufteilen, so dass es nur noch eine einzige read-Funktion im ganzen Programm gibt und nur die find-Funktion je nach Datei anders aussieht.

    In der main-Funktion rufe ich also folgende Funktionen auf:

    int main()
    {
        test frage;
        frage.read("datei.txt");
        frage.find("ABC");
        return 0;
    }
    

    Die read-Funktion könnte dann ja so aussehen:

    bool test::read(const string dateiname)
    {
        ifstream IN;
        IN.open (dateiname.c_str());
        if (IN.good())
        {
            string zeile;
            while (getline(IN, zeile))
            {
                if (!zeile.empty())
                {
                    return true;
                }
            }
        }
        else
        {
            cout<<"FEHLER\n";
            return false;
        }
        IN.close();
    }
    

    In der find-Funktion werden später dann mehrere Fälle für die unterschiedlichen Dateien unterschieden, aber bis jetzt sieht es so aus:

    const double test::find(const string& schluesselwort) const
    {
        string zeile;
        double wert;
        if (zeile.find(schluesselwort) != string::npos)
        {
            // hier wird dann die entsprechende Zeile zerlegt und der Wert herausgeschrieben
            return wert;
        }
    }
    

    Wie muss ich denn jetzt die beiden Funktionen "verknüpfen", dass es dann auch funktioniert? Denn bis jetzt weiß ja die find-Funktion nicht, wo sie eigentlich nach dem Schlüsselwort suchen soll...

    Vielen Dank schon mal!



  • Am besten, du speicherst die einzelnen Zeilen in einen std::vectorstd::string (oder alternativ auch in einen einzigen std::string).

    Such mal hier im Forum nach "Datei einlesen" o.ä.



  • Wie mach ich denn das Speichern in einen einzigen String?

    bool test::read(const string dateiname)
    {
        ifstream IN;
        IN.open (dateiname.c_str());
        if (IN.good())
        {
            string zeile;
            while (getline(IN, zeile))
            {
                if (!zeile.empty())
                {
    [b]                test::bsp = line;[/b]
                }
            }
            return true;
        }
        else
        {
            cout<<"FEHLER\n";
            return false;
        }
        IN.close();
    }
    

    Dementsprechend heißt es dann in der find-funktion:
    ...
    if (test::bsp.find(schluesselwort) != string::npos)
    ...

    Nur wenn ich das so mache, dann steht in dem string "bsp" natürlich nur die letzte Zeile. Geht das nicht auch, dass ich alle Zeilen zur Verfügung hab?



  • zB indem du der Funktion read eine Referenz auf einen std::vectorstd::string übergibst und dort die Zeilen reinschreibst. Diesen gibst du dann auch an die find-Methode weiter oder läßt die find-Methode durch eine Schleife über jede Zeile laufen.


Log in to reply