list oder vector oder array oder ???



  • Yvonne schrieb:

    Danke für die Link's, gibt's so etwas auch für ifstream? - Komme damit noch nicht wirklich zurecht...
    Grüße
    Yvonne

    Hier, schau dir mal das an:

    http://www.cplusplus.com/ref/indexr.html

    mfg
    v R



  • Also, ich lese einen string ein, in dem eine Zeile mit den beiden Werten steht.
    Da beide Werte durch mindestens ein Leerzeichen oder ein Tab getrennt sind (meistens werden die Werte aus einer EXCEL-Tabelle extrahiert), kann ich mit
    getline(cin, datenstring, ' ');
    den linken Wert (also den x-Wert) auslesen, aber wie komme ich an den Rechten?
    Außerdem kriege ich auch Datensätze, wo zu Beginn einer Zeile auch noch Leerzeichen stehen können (vermutlich eine leere EXCEL-Spalte mitkopiert und in die .dat-Datei eingefügt). Wie vermeide ich da Fehler?
    Grüße
    Yvonne



  • Sorry, es geht ja doch!
    Ich kriege die einzelnen Werte zurückgeliefert, warum ist mir aber nicht ganz klar, laut MSDN sollt es nur der jeweils erste Wert sein...
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcstdlib/html/vcsampsamplestringccgetlinestlsample.asp
    🙄



  • Leider geht es doch nicht wirklich,
    also hier mal mein Codeausschnitt (wobei fin mein ifstream ist):

    int i=0;
    for (string ReadString; getline(fin,ReadString,' '); ){
    i++;
    if(i%2){
    doubleList.push_back(ReadString);
    }
    }
    fin.close();

    meine Testdaten:
    x y
    100 200
    300 400

    was allerdings letztlich in der Liste steht ist:
    100 und 400
    (statt 100 und 300 wie ich erwartet hätte)
    was mach ich falsch?

    Grüße
    Yvonne



  • versuch mal

    FILE *fp;
    fp = fopen("file.txt", "r");
    
    for(int i1 = 0; i1 < numOfPoints; i1++) {
        double x, y;
        if(fscanf(fp, "%lf %lf", &x, &y) != 2) {
            cout << "Ooops, keine 2 Werte in einer Zeile" << endl;
        }
        // Speichere die Werte x und y irgendwie und irgendwo.
    }
    


  • Och nö, bitte nicht C schreiben.

    Warum nicht einfach so?`

    #include <iostream>
    #include <fstream>
    
    using namespace std;
    
    int main()
    { 
      ifstream file("Dateiname");
    
      double x, y;
    
      while(file)
      {
        file >> x >> y;
        // so Werte sind eingelesen und müssen nur noch eingefügt werden
        ´liste.push_back(make_pair(x,y)); // oder so ähnlich
      }
    }
    


  • Jester schrieb:

    Och nö, bitte nicht C schreiben.

    auch schön 😃



  • Danke! Habe es so gelöst:

    while(fin)
    {
    double x, y;
    fin >> x >> y;
    doublexList.push_back(x);
    doubleyList.push_back(y);
    }

    Welche List verwendest Du für make_pair Jester?
    Habe es mit list<string> und list<double> ausprobiert, bekomme aber immer den Fehler:
    error C2664: 'std::list<_Ty>::push_back': Konvertierung des Parameters von 'std::pair<_Ty1,_Ty2>' in 'const double &' nicht möglich
    with [_Ty=double] and [_Ty1=double,_Ty2=double]

    und für die string-Variante sowieso Konvertierungsfehler von double in const std::string &

    Wäre wirklich interessant, wie's geht, weil es ziemlich einfach aussieht 🙄

    Grüße Yvonne

    P.S.: Vielleicht frage ich irgendwann mal, wie ich das Ganze wieder in eine Datei schreiben muß... 😉



  • Das wäre dann
    vector<pair<double, double> >
    Für pair <utility> einbinden nicht vergessen.
    Aber ich denke es ist geschickter für den Meßwert ne Klasse zu bauen. Immerhin gehören die Werte ja zusammen und dann kannste auch gleich nen Vergleicher dafür bauen, damit Du sortieren kannst.

    MfG Jester



  • Yvonne schrieb:

    Welche List verwendest Du für make_pair Jester?

    erstell doch mal eine Klasse Pair mit zwei Membervariablen double x und double y

    sowie einem

    //! Vergleichsop

    bool Pair::operator<(Pair& other) {
    return (this->x > other.x);
    }



  • Habe gerade festgestellt, dass die letzte Zeile bei mir 2x eingelesen wird 😕
    Woran kann das liegen?

    Grüße
    Yvonne



  • Hängt es vielleicht mit while(fin) zusammen?



  • Ja, das hängt damit zusammen. Blöderweise wird nämlich das eof-Bit erst mit dem ersten erfolglosen Zugriff gesetzt... und damit erst, wenn versucht wird die Zeile nach der letzten einzulesen. Dann bist Du aber schon in der Schleife 😞



  • O.K., bei Listen ist das ja kein größeres Problem, da kann man ja mit .pop_back(); das letzte Element einfach löschen. Habe auch keine bessere Methode gefunden 🙄
    Gruß
    Yvonne



  • O.K., bei Listen ist das ja kein größeres Problem, da kann man ja mit .pop_back(); das letzte Element einfach löschen. Habe auch keine bessere Methode gefunden 🙄
    Gruß
    Yvonne



  • Yvonne schrieb:

    Habe auch keine bessere Methode gefunden 🙄

    Probier mal

    while(fin>>x>>y)
    {
    ..
    }
    


  • Funktioniert! Super! Danke!
    Welche Klassen würdet Ihr denn für dieses Problem kreiren?
    Eine für die Listen oder/und eine für jedes Paar?
    Habe das noch nicht so ganz verstanden, bin aber noch relativ unerfahren mit OOP. Kenne zwar die Prinzipien, habe aber bisher meist prozedural programmiert.



  • Habe jetzt mal eine Klasse für die Koordinaten gebastelt:

    #include "Koord.h"
    
    Koord::Koord(){}
    Koord::Koord(double x, double y){
    	itsx=x;
    	itsy=y;
    }
    Koord::~Koord(){}
    
    double Koord::getx(){
    	return itsx;
    }
    

    mit den privaten Datenelementen double itsx und double itsy.

    ich versuche nun nach:

    list<Koord> koordList;
    double x,y;
    while(fin>>x>>y){
       double x, y;
       fin >> x >> y;
       koordList.push_back(Koord(x,y));
    }
    fin.close()
    

    mit:

    for(list<Koord>::const_iterator ci = koordList.begin(); ci!=koordList.end(); ++ci)
    cout <<*ci << "\n";
    

    ich dereferenziere also den Iterator-Zeiger und erhalte dann was??? Wie komme ich an die Inhalte meiner Objekte? **ci geht nicht und *ci->getx() auch nicht 😞
    Bin etwas ratlos
    ???
    :xmas1:



  • Also ich habe es folgendermaßen gelöst:

    for(list<Koord>::const_iterator ci = koordList.begin(); ci!=koordList.end(); ++ci){
       const Koord& test = *ci;
       cout << test.itsx << "\n";
    }
    

    Damit das funktioniert mußte ich meine Datenelemente public setzten, was ich eigentlich nicht wirklich will 😞
    Aber mit

    cout << test.getx() << "\n";
    

    bekomme ich folgenden Fehler:
    error C2662: 'Koord::getx': this-Zeiger kann nicht von 'const Koord' in 'Koord &' konvertiert werden 😮

    Kann mir das jemand erklären???
    Grüße
    Yvonne



  • Zugriff über den iterator geht mit it->getx();

    Was Dich da später ereilt ist const-correctness. Du legst ne const-Referenz auf das Objekt an. Das ist gut. Dann rufst Du getx auf, aber der Compiler weiß nicht, daß die Funktion das Objekt nicht verändern wird und verbietet Dir das daher. Du mußt dem Compiler noch mitteilen, daß Dein get const ist, also das Objekt nicht verändert:

    class Koord
    {
      // ...
      double getX() const;
      // ...
    };
    
    double Koord::getX() const
    {
      return x;
    }
    

Anmelden zum Antworten