txt in eine liste
-
hi,
danke für deine antwort.
ja wenn ich das mit struct und arrays mache. lassen die sich dann auch so einfach sortieren.
wenn ich jetzt z.b. nach spalte 2 sortieren will müssen die anderen elemente sich ja auch anpassen.campino
-
naja dann würde ich ggf eine struct mit string und array oder 3 ints nehmen,
und nen vector<struct_t>
dann könntest du 3 sortier funktionen schreiben bzw eine templatefunktion die die art der sortierung bekommt-also quasi ne funktoin
second_less(struct_t one,struct_t other){// wenns nach dem 2ten gehen soll
return one.sec<other.sec;
}dann nen sort und dann deine vergleichsfunktion benutzen
-
also hier mal nen kleiner ansatz. vll kann er dir ja helfen:
struct data_t{ int a_,b_,c_; std::string str_; data_t(int a,int b,int c,const std::string& d):a_(a),b_(b),c_(c),str_(d){} }; // deine sorter: const bool sort_first(const data_t &a,const data_t &b){ return a.a_<b.a_; } const bool sort_sec(const data_t &a,const data_t &b){ return a.b_<b.b_; } const bool sort_third(const data_t &a,const data_t &b){ return a.c_<b.c_; } const bool sort_str(const data_t &a,const data_t &b){ return a.str_<b.str_; } [...] std::vector<data_t> db; // den vector füllen // eine der 4 funktionen benutzen std::sort(db.begin(),db.end(),sort_first);//oder sec oder third std::sort(db.begin(),db.end(),sort_str);das bsp bezieht sich hier aber nur auf die sortierung.
klassendesign kapselung und oder memberfunktionen usw hab ich mal ausser acht gelassen um das wesentliche zu zeigen.
-
danke für deine mühe.
aber wie bekomm ich jetzt die werte aus der txt in meinen struct bzw. vector?
ich versteh nicht wie man den vector jetzt mit werten füllt.
und wnn ich jetzt sortiere soirtiert er mir immer nur eine spalte oder? ich will wenn ich nach 1. spalte sotiere das sich die anderen auch mit verndern weil sie unmittelbar zusammenhängen.campino
-
Als erstes schreibst du dir eine kleine Funktion, die dir einen einzelnen struct aus der Datei liest:
istream& operator>>(istream& sin,data_t& data); { sin>>data.str_>>data.a_>>data.b_>>data.c_; sin.ignore(1000);//Rest der Zeile wird ignoriert return sin; }Als nächstes kannst du diesen Operator in eine Schleife einbauen, die deinen Vektor füllt:
vector<data_t> werte; ifstream fin("werte.txt"); data_t a_wert; while(fin>>a_wert) //struct einlesen werte.push_back(a_wert); //in Vektor packenPS: Die Struktur ist eine Einheit - wenn du dort etwas sortierst, werden die kompletten Datensätze umgeordnet.
-
ok danke,
ich hab gerade versucht den vector auszulesen mit einem iterrator doch das kalppt nicht. muss ich dazu den ausgabeoperator auch überladen?
-
Du kannst, du kannst aber auch direkt auf die Elemente zugreifen:
for(vector<data_t>::iterator pos=werte.begin();pos!=werte.end();++pos) cout<<pos->str_<<' '<<pos->a_ /*und so weiter*/;
-
hi also mein progg sieht jetzt so aus:
#include "stdafx.h" #include <string> #include <vector> #include <fstream>; using std::string; using std::cout; using std::cin; using std::ostream; using std::istream; using std::ifstream; using std::vector; struct data_t { int a_,b_,c_; std::string str_; /*data_t(int a,int b,int c,const std::string& d):a_(a),b_(b),c_(c),str_(d) { }*/ }; ostream &operator<<(ostream &output,data_t &num) { output<<num.a_; return output; } istream &operator>>(istream& sin,data_t& data) { sin>>data.str_>>data.a_>>data.b_>>data.c_; sin.ignore(1000); return sin; } const bool sort_first(const data_t &a,const data_t &b){ return a.a_<b.a_; } const bool sort_sec(const data_t &a,const data_t &b){ return a.b_<b.b_; } const bool sort_third(const data_t &a,const data_t &b){ return a.c_<b.c_; } const bool sort_str(const data_t &a,const data_t &b){ return a.str_<b.str_; } int _tmain(int argc, _TCHAR* argv[]) { vector<data_t> liste; ifstream file("werte.txt"); data_t wert; while(file>>wert) //struct einlesen liste.push_back(wert); std::vector<data_t>::const_iterator iter; cout<<liste.size(); //std::sort(db.begin(),db.end(),sort_first);//oder sec oder third //std::sort(db.begin(),db.end(),sort_str); for(iter=liste.begin(); iter!=liste.end();iter++) { cout<<liste[2]; } cin.get(); return 0; }er liest mir aber das file nicht ein

-
Erstens: Mit was für einem Fehler meldet sich der Compiler?
Zweitens:
campinoaf schrieb:
#include "stdafx.h" #include <string> #include <vector> #include <fstream>; using std::string; using std::cout; using std::cin; using std::ostream; using std::istream; using std::ifstream; using std::vector;Zum Sortieren fehlt da noch:
#include <algorithm> using std::sort;(oder du verwendest gleich "using namespace std;")
const bool sort_first(const data_t &a,const data_t &b){ return a.a_<b.a_; }das "const" im Rückgabetyp ist wohl überflüssig.
for(iter=liste.begin(); iter!=liste.end();iter++) { cout<<liste[2]; }Was soll denn das werden? Du schreibst n-mal das dritte Element deiner Liste:
cout<<*iter;PS: Stimmt eigentlich der Name deiner Eingabedatei?
-
jetzt hat es doch geklappt, dank euch
