Frage zu getline
-
pitaz schrieb:
Habs mittlerweile selber rausgefunden. Liegt am pushback, ich schreibe immer die ersten werte von values in das array. Das ist dann wohl ein Bsp. für eine doof Frage
Ich bezweifel das was auch immer am push_back liegt. Eine Bessere Fehlerbeschreibung wäre auch hilfreicher ("Ich verstehe jedoch nicht warum es nicht funktioniert." Ist KEINE sinnvolle Fehlerbeschreibung).
Und wenn du wie du sagst "im Rahmen meiner Master-Arbeit" das ganze schreibst, sollte ich dir zutrauen können, auch sinnvolle und vor allem ausreichend formulierte Fehlermeldung (wenn möglich mit angabe der ersten Compilerfehler, falls es welche gibt...) zu verfassen.
Mich wundert es auch nicht das du mit C++ Probleme hast. Du programmierst scheinbar in C++ auf eine C-"Art und Weise", die Konzepte unterscheiden sich aber wesentlich.
cu André
P.S: Und das dein Code nicht "gerade elegant programmiert ist" brauchst du nicht mal zu schreiben
-
pitaz schrieb:
Habe folgenden Code, der zugegebenermasse etwas umständlich die Anzahl Zeilen und Anzahl Spalten der Tabelle im txt-File ermittelt. Das funktioniert soweit auch. Jedoch liest getline bei jedem Durchlauf der while -Schleife die erste Zeile ein, obwohl die Position des get-Pointers jedes mal zur nächsten Zeile geht.
das getline arbeitet korrekt, aber der vector value wird immer weiter geschrieben, während Du immer wieder das 2. und 3. Element ausgibst (warum nicht das erste?), welche nie überschrieben werden.
Verschiebe die Zeile 7 vor die Zeile 15, und kopiere die gleiche Zeile nochmal vor die Zeile 57.
Füge dann vor Zeile 43 noch ein 'if( value.size() > 2 )' ein.
Tausche die Zeilen 50 und 51 aus. Man kann den seekg nur dann erfolgreich aufrufen, wenn der Stream vorher nicht im Fehlerzustand war.
Den Code ab Zeile 62 solltest Du nochmal überarbeiten, da sind die Schleifen durcheinander gekommen.
ggf. die Zeile 68 noch gegen 'for(int j=0; j<value.size(); ++j)' austauschen, dann stürzt es wenigstens nicht ab.:xmas2: Werner
-
Hallo nochmal
Es hat nur daran gelegen dass ich den vector value nicht vor jeder schleife wieder geleert hab. Jetzt läuft es ganu so wie ich mir das vorstelle.
asc schrieb:
Mich wundert es auch nicht das du mit C++ Probleme hast. Du programmierst scheinbar in C++ auf eine C-"Art und Weise", die Konzepte unterscheiden sich aber wesentlich.
Leider weiss ich nicht was C++ auf eine C-Art ist. Bin halt kein Programmierer. Hatte vor Jahren mal nen c++-kurs an der Uni und versuche nun, dieses (sehr beschränkte) Wissen wieder hervorzuholen.
-
pitaz schrieb:
Leider weiss ich nicht was C++ auf eine C-Art ist. Bin halt kein Programmierer. Hatte vor Jahren mal nen c++-kurs an der Uni und versuche nun, dieses (sehr beschränkte) Wissen wieder hervorzuholen.
Naja, C++ basiert ja auf C, trotzdem sind mit der Objektorientierung und generischen Programmierung völlig neue Paradigmen ins Spiel gekommen.
Dein Code ist aber nicht typisch für ein "C in C++ programmieren" - das einzige, was ich beim Überfliegen gesehen habe, war
strtod()
, was du überstd::stringstream
lösen könntest. Und rohe Arrays sind halt nicht so schön.Für Tutorials und gute Bücher zu C++ schaust du am besten in den FAQ nach.
-
Sorry, aber was genau ist ein roher array?
Du mienst warscheinlich die Mat Variable.
Hab sie so initialisiert: vector<vector<double>> Mat;
Ist das nicht ok?
Wenn nicht, warum nicht?
-
ein rohes array (auch oft als C-Array bezeichnet) ist so was:
statisch:
Type name[anz];
dynamisch:
Type *name = new Type[anz];
(nicht zu vergessendelete []name;
- wobei wir auch schon beim nachteil angekommen wären ^^)std::vector ist ein wrapper für solch rohe arrays (stellt zuweisungs/vergleichs/... -operatoren bereit und kümmert sich um (de)allozierung(en)) und ist - so lange nichts dagegen spricht - den rohen Arrays vorzuziehen.
btw:
in deinem code wäre ein reserve und push_back besser als ein resize und [] so fern ich jz nichts übersehen habe...bb
-
pitaz schrieb:
Ist das nicht ok?
Doch, sorry, ich hatte falsch nachgeschaut. Tut mir leid.
unskilled schrieb:
std::vector ist ein wrapper für solch rohe arrays [...] und ist - so lange nichts dagegen spricht - den rohen Arrays vorzuziehen.
Nicht ganz. Um genau zu sein, ist
std::vector
nur ein Wrapper für dynamische Arrays.Für statische Arrays ist
std::tr1::array
(oderboost::array
) besser geeignet.
-
Nexus schrieb:
unskilled schrieb:
std::vector ist ein wrapper für solch rohe arrays [...] und ist - so lange nichts dagegen spricht - den rohen Arrays vorzuziehen.
Nicht ganz. Um genau zu sein, ist
std::vector
nur ein Wrapper für dynamische Arrays.Für statische Arrays ist
std::tr1::array
(oderboost::array
) besser geeignet.sry, dass ich das net mit erwähnt hatte - lag daran, dass ich das statische array erst ergänzt hab, als ich im prinzip schon fertig mit schreiben war ^^
bb
-
Noch was
Nexus schrieb:
Dein Code ist aber nicht typisch für ein "C in C++ programmieren" - das einzige, was ich beim Überfliegen gesehen habe, war
strtod()
, was du überstd::stringstream
lösen könntest. Und rohe Arrays sind halt nicht so schön.Ich weiss, dass die strtod-Funktion nicht C++ ist. Hab aberin der string-Klasse keine Funktion gefunden. Wie genau konvertiert man denn einen string zu einem double in C++?
-
Eben mit
std::stringstream
.std::string StringVar; double DoubleVar; std::stringstream Stream; Stream << StringVar; Stream >> DoubleVar;
Wenn du Boost hast, kannst du auch
boost::lexical_cast
benutzen.