[c++] Variablen aus Textdatei lesen

guddy

Mitglied
Hallo,

ich habe folgendes Problem:
Ich möchte aus einer Textdatei Werte auslesen und in ein Array vom Typ integer überführen. Dabei ändert sich die Anzahl der Variablen mit der ebenfalls dort eingegebenen Variable Anz_Var. Die Datei sieht ungefähr so aus:

Anzahl Variablen: 3

Var_nr;uGrenze;oGrenze
1;5;50
2;44;450
3;50;100


Ich habe schon mit ifstream die Zeilen einlesen können. Komme aber dann nicht weiter.

Wie komme ich an die "3" und wandele den String dann in einen Integerwert? Diesen Wert weise ich dann einer Variable Anz_Var zu.

Dann ein 3D-Feld int array[Anz_Var] erstellen.
Wie kann ich das Feld mit den Werten füllen? (Die Zahlen 1, 5, 50 der ersten zeile und der anderen Zeilen sind immer durch ein Semikolon (bzw. einen Tab-Stopp) getrennt.)

Vielen Dank für eure Mühe.

Grüße

Guddy
 
Ma dein Beispielfile ist mist ;) 3 Werte für Var_nr usw. oder 3 mal sowas wie Var_nr mit beliebig vielen Werten?
 
Hey,

die Anzahl Variablen gibt an wieviel Zeilen es geben soll. Bei Anzahl Variablen = 4. Gibt es Var. nr. 1, 2, 3, 4. Bei Dazu jeweils eine obere und untere Grenze.

Grüße

Guddy
 
Hallo,

Ich habe schon mit ifstream die Zeilen einlesen können. Komme aber dann nicht weiter.
Guddy

du musst es splitten, also nach semikolon bzw. end-tags durchsuchen.

Bei weiteren Fragen, einfach stellen ;)

Grüße, random.

Edit:
warum hast du einen Inkonsistenten Datei-aufbau?

Anzahl Variablen: 3 <-- würde ich raus nehmen, weil du es sowieso anhand der "Var_nr" erkennst..

Var_nr;uGrenze;oGrenze
1;5;50
2;44;450
3;50;100
 
Zuletzt bearbeitet:
Hey random,

ich dachte mir, wenn ich ein statisches Feld erzeuge zum einlesen der Werte kann ich diesen Wert wie folgt verwenden: array[Anzahl_Var] [3].

Wie kann ich den stream denn durchsuchen? und wie wandle ich die Stringwerte in integer?

Grüße

Guddy
 
Nja würde es Binär aufbauen ... also das Dateiformat ... aber okay geht so auch ... ist schon sinnvoll, das oben hinzuschreiben, dann kannste direkt die volle größe für deine array reservieren und sparst dir das reallokieren ...
C++:
struct var
{
    typedef std::pair<unsigned int, unsigned int> bounding_t;
    bounding_t bounds;

public:
    var()
        : id(0)
    {}

public:
    friend std::istream& operator>>(std::istream& in, var& data)
    { 
        if (!(in >> data.id) || !(in.ignore() >> data.bounds.first) || !(in.ignore() >> data.bounds.second)) in.setstate(std::failbit)
        return in;
    }
    friend std::ostream& operator<<(std::ostream& out, var const& data)
    { return out << data.id << ";" << data.bounds.first << ";" << data.bounds.second << std::endl; }
private:
    unsigned int id;
};

int main()
{
    std::ifstream file_stream("sample.txt");
    if (!file_stream) return 1;
    
    std::size_t const_elemente(0);

    // TODO: anzahl elemente parsen ... musse selbst machen!

    std::vector<var> data(count_elemente);
    std::copy(std::istream_iterator<var>(file_stream), std::istream_iterator<var>(), data.begin());
    // use data ....
}
 
Zurück