Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » istream + Leerzeichen

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 <
000
28.10.2004, 09:10 Uhr
~Frank2
Gast


Moin.

Ich möchte eine Klasse in einen Stringstream schreiben können und sie auch wieder auslesen können.
Das Problem ist, daß hier auch Strings in den Stringstream sollen, welche Leerzeichen (aber keine endlines) enthalten können. Damit kommt aber istream nicht klar, das Leerzeichen wird als Feldtrenner interpretiert. Kann man da was machen, z.B. istream sagen es soll die Felder mit ;; trennen oder so... ??


C++:
#include <sstream>
#include <iostream>

using namespace std;

class Test {
public:
  int    i;
  string str;
  double  f;
};

std::ostream& operator<<(std::ostream &os, const Test& t) {
  os << t.i << endl << t.str << endl << t.f << endl;
  return os;
}

std::istream& operator>>(std::istream &is, Test& t) {
  is >> t.i >> t.str >> t.f;
  return is;
}


int main( void )
{

  Test t, t2;
  t.i = 1;
  t.str = "halloworld";    // hier darf kein Leerzeichen drin sein
  t.f = 3.345;

  stringstream str;
  str << t;

  cout << str.str() << endl;

  str >> t2;
  cout << t2 << endl;

  return 1;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
28.10.2004, 09:33 Uhr
(un)wissender
Niveauwart


Würde mich auch interessieren, stringstream ist ansonsten für mich endgültig gestorben, die C-Sachen sind da viel besser, ala snprintf, usw.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
28.10.2004, 10:43 Uhr
Devil



Strings am besten mit read und write in den stream schreiben/lesen.
Ich machs immer so, das ich erst die länge des strings reinschreibe,
und dann den string in den stream schreibe, beim auslesen
erst die Länge auslesen, und dann read.

Devil
--
Intelligenz ist eine Illusion des Menschen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
28.10.2004, 10:44 Uhr
virtual
Sexiest Bit alive
(Operator)


Welches Zeichen willst Denn sonst als Trenner nehmen?
- Ein newline? - Dann nimm std::getline(str, t2), um den String auszulesen.
- Ein beliebiges anderes Zeichen? std::getline(str, t2, <DeinZeichenHier>

Wenn Du aus irgendeinem Grund keine existierende Methode/Routine nimmst, und die Zeichen einzeln einlesen willst, wird der Stream erstmal hingehen und die Leerzeichen überlesen (das gilt nicht für die Lösungen oben!). Wenn Du das nicht willst, solltest Du deinem Stream ein herzliches str.unsetf(std::ios_base:skipws) wünschen.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
28.10.2004, 11:52 Uhr
~Frank2
Gast


Wie ich das sehe funktionieren beise Lösungen (lesen mit istream::read, und std::getline),
haben aber den Nachteil, daß ich den >> Operator nicht mehr benutzen kann um die Werte direkt in die
Variablen i,str,f zu schreiben.

Ich habe dann ja nen String / Char Zeiger und muß dann mit atoi usw. arbeiten?

Oder blicke ich da jetzt was nicht ?




Frank
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
28.10.2004, 12:46 Uhr
virtual
Sexiest Bit alive
(Operator)


Wenn Du integerwerte wirklich binär ablegen willst, dann darfst Du sie nicht als Text speichern:
>> und << arbeiten generell Textorientiert.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ 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: