Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » std::string Zeile für Zeile in ein vector

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 <
010
30.07.2003, 14:35 Uhr
~Peter
Gast


@Loddab

Jetzt bin ich total durch 'n Wind!

Das geht doch alles so gar nicht!


Code:
if(..)
{
wDaten str;
vecBla.push_back(str);
}



Ist absoluter Quatch!



Schau Dir mal meinen ursprünglichen Code an:


Code:
if(...) // mache so lange weiter, bis keine Daten mehr
        //in std::string aInhalt vorhanden sind
{
    wDaten st1;
    st1.beg = (int) temp1; //temp1 ist ein std::string
    st1.en = (int) temp2;
    st1.wWert = (float) temp3;
    st1.Sonstige = (int) temp4;
    vecBla.push_back(str1);
}





st1 muß vom Typ "wDaten" sein.
in st1 muß jeder Wert einzeln eingelesen werden.


Wenn ich jetzt einfach str nehme (nach dem Code von 0xdeadbeef)
läuft das ganze doch gar nicht!
Dann habe ich ja ein Vector, dessen Element aus "einer" "Zeile" besteht.
Jedes Element soll aber 4 Unterpunkte haben, d.h.

Das erste Element von vecBla soll dann so aussehen:
"beg = 5556 en = 6556 wWert = 5 Sonstige = 98"

und nicht so:
"5556 6556 5 98"

Verstehst Du was ich meine? Oder reden wir die ganze Zeit irgendwie aneinander vorbei?

Ich bin ganz durcheinander!

@0xdeadbeef

Habe ich mir noch nicht durchgelesen, mache ich gleich!

Gruß
Peter
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
30.07.2003, 14:39 Uhr
0xdeadbeef
Gott
(Operator)


Um den Stringstream wirst du nich drumrum kommen, einfache Casts ala

C++:
char *bla = "1234";
int x = (int) bla;


haben nicht den gewünschten Effekt. Danach hast du in x nur Müll stehen (bzw. eine Speicheradresse, an der "1234" steht).
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
30.07.2003, 14:46 Uhr
~Peter
Gast


Hallo 0xdeadbeef!

Gegen den Stringstream habe ich ja nischt gesagt. Ich mache es ja selbst so!

ich lese die Zeile in ein std::string
übergebe es an eine Funktion, die mir die Zeile aufgesplittet als "vector (test) übergibt"

und in Wirklichkeit setze ich den ZwischenVektor (test) ein. Nämlich so:


Code:
if(...) // mache so lange weiter, bis keine Daten mehr
        //in std::string aInhalt vorhanden sind
{
    wDaten st1;
    st1.beg = (int) test[0]; //temp1 ist ein std::string
    st1.en = (int) test[1];
    st1.wWert = (float) test[2];
    st1.Sonstige = (int) test[3];
    vecBla.push_back(str1);
}



Und es ist trotzdem zu langsam.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
30.07.2003, 14:59 Uhr
0xdeadbeef
Gott
(Operator)


Ach so. Ich verstehe zwar nicht, warum du das so umständlich machst, aber so könnte es funktionieren. Warum liest du das Zeug in ein Array ein, und nicht gleich in dein WDaten-struct?
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
30.07.2003, 15:07 Uhr
~Peter
Gast


>...aber so könnte es funktionieren.

Es funkt ja auch, aber es ist einfach zu langsam, ich habe ja noch andere Strings in der Form und wenn dann 1000de von solchen Strings so durchgearbeitet werden müssen, dann gute Nacht! Es ist einfach zu langsam.

>Warum liest du das Zeug in ein Array ein, und nicht gleich in dein WDaten-struct?

Bitte um nähere Erläuterung!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
30.07.2003, 15:23 Uhr
0xdeadbeef
Gott
(Operator)


Naja, vermutlich wird dein Code ja etwa so aussehen:

C++:
string aInhalt;
stringstream s;
s.str(aInhalt);
double test[4];
WDaten wd;
vector<WDaten> vecBla;

//...
s.str(aInhalt);
for(int i = 0; i < 4; ++i)
    s >> test[i];
if(/*Hier bitte geeignete Bedingung einsetzen*/) {
    wd.beg = (int) test[0];
    wd.end = (int) test[1];
    wd.wWert = test[2];
    wd.Sonstiges = (int) test[4];
    vecBla.push_back(wd);
}


Einfacher wäre so:

C++:
string aInhalt;
stringstream s;
WDaten wd;
vector<WDaten> vecBla;

//...
s.str(aInhalt);
s >> wd.beg >> wd.end >> wd.wWert >> wd.Sonstiges;
if(s.fail()) throw s;
else vecBla.push_back(wd);


Wenn du kein Problem damit hast, Operatoren zu überladen, wäre das natürlich am einfachsten - hab ich ja oben schon beschrieben. Dann sieht das nur noch so aus:

C++:
s.str(aInhalt);
s >> wd;
if(s.fail()) throw s;
else vecBla.push_back(wd);


Die Fehlerbehandlung musst du halt entsprechend anpassen, throw s; allein bringt es wahrscheinlich nicht so richtig.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 30.07.2003 um 15:26 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
30.07.2003, 15:26 Uhr
~Peter
Gast


Okay, ich verstehe. Vielen Dank für Deine Hilfe!

Ich werde es gleich testen und hoffen, daß es nun ein wenig schneller läuft!

Gruß
Peter
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: