WinFuture-Forum.de: Problem Mit C++ Stringstream - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

Problem Mit C++ Stringstream schreibt nicht in den Stream


#1 Mitglied ist offline   Torian 

  • Gruppe: aktive Mitglieder
  • Beiträge: 68
  • Beigetreten: 01. September 04
  • Reputation: 0
  • Geschlecht:Männlich

geschrieben 09. September 2005 - 14:24

Moin,
also ich will die einzelnen Buchstaben eines Strings in Integer konvertieren.
dazu habe ich mir eine kleine Funktion geschrieben, die wie folgt aussieht:

unsigned long wort2zahl(string wort)
{
    stringstream zahl;
    unsigned long nummer=0;
    cout << "Function: " << wort << endl;
    zahl <<tmp;
    cout << "Function: " << zahl << endl;
    zahl >>nummer;
    cout << "Function: " << nummer << endl;
    return nummer;          
}


Die Ausgaben sind nur zu überprüfung drinnen und dabei gibt er mir bei der ersten Ausgabe auch richtig den Buchstaben aus, bei der zweiten steht dann "0x22FCFC" obwohl dort dann eigentlich der übergebene Buchstabe stehen sollte, und zwar bei jedem Buchstaben, in der dritten steht dann immer ne Null.

Weiß einer von euch was ich da Falsch gemacht habe?
Achja die Funktion wird in einer Schleife aufgerufen und das sooft bis das Wort abgearbeitet ist.

Gruß
Torian
0

Anzeige



#2 Mitglied ist offline   Rika 

  • Gruppe: aktive Mitglieder
  • Beiträge: 11.533
  • Beigetreten: 11. Juni 03
  • Reputation: 2
  • Geschlecht:Männlich

geschrieben 09. September 2005 - 14:41

Zitat

bei der zweiten steht dann "0x22FCFC" obwohl dort dann eigentlich der übergebene Buchstabe stehen sollte

Nein, es sollte der Wert der nichtinitialiserter Variable tmp drinstehen - was auch der Fall zu sein scheint.

Zitat

in der dritten steht dann immer ne Null.

Auch logisch. Schließlich ist nummer=0, da zahl >>nummer stets das den Stringstream terminierende Null-Byte ausliest und in einen long konvertiert.

Wie mir scheint, hast du ganz einfach keine Ahnung, was du tust.
Konnichiwa. Manga wo shitte masu ka? Iie? Gomenne, sonoyouna koto ga tabitabi arimasu. Mangaka ojousan nihongo doujinshi desu wa 'Clamp X', 'Ayashi no Ceres', 'Card Captor Sakura', 'Tsubasa', 'Chobits', 'Sakura Taisen', 'Inuyasha' wo 'Ah! Megamisama'. Hai, mangaka gozaimashita desu ni yuujin yori.
Eingefügtes Bild
Ja, mata ne!

(For sending email please use OpenPGP encryption and signing. KeyID: 0xA0E28D18)
0

#3 Mitglied ist offline   Torian 

  • Gruppe: aktive Mitglieder
  • Beiträge: 68
  • Beigetreten: 01. September 04
  • Reputation: 0
  • Geschlecht:Männlich

geschrieben 09. September 2005 - 17:03

Danke für das Kompliment Rika, nett wie eh und jeh....
Wegen der Variable tmp, ich hatte da nur probiert ob es geht wenn man den übergebenen wert noch in eine Variable speichert was aber nicht der fall war, als ich es gepostet habe habe ich das nur schnell rausgenommen und dabei diese bezeichnung übersehen, eigentlich steht da
 zahl << wort;

aber auch so geht es nicht.

edit: Moment mal sollte zahl >>nummer; nicht den Inhalt von zahl in Nummer speichern und nicht nur das terminierende Byte?

Gruß

Dieser Beitrag wurde von Torian bearbeitet: 09. September 2005 - 17:05

0

#4 Mitglied ist offline   Rika 

  • Gruppe: aktive Mitglieder
  • Beiträge: 11.533
  • Beigetreten: 11. Juni 03
  • Reputation: 2
  • Geschlecht:Männlich

geschrieben 09. September 2005 - 18:13

Zitat

Moment mal sollte zahl >>nummer; nicht den Inhalt von zahl in Nummer speichern und nicht nur das terminierende Byte?

Naja, in "zahl" war ja nix drin.

Jetzt hast du nur noch das Problem, daß "zahl" nachwievor ein unintialisierter Stream ist und du ihn zudem zweimalig ausliest. Beim ersten Mal für die Ausgabe, da liefert er natürlich das, was drin steht, nömlich zufälligen Müll, und entfernt es ordnungsgemäß. Dann, beim zweiten Mal, kommt nur noch die Null-Terminierung, damit ist nix mehr im Stream drin, und es wird 0 zurückgeliefert. Der Inahlt von "wort" ist hinter der Terminierung und wird gar nicht mehr beachtet.

Lösung: Stream initialisieren oder einfach mal bereits die vorhandene Konvertierung in der libcppstd oder STL verwenden.
Konnichiwa. Manga wo shitte masu ka? Iie? Gomenne, sonoyouna koto ga tabitabi arimasu. Mangaka ojousan nihongo doujinshi desu wa 'Clamp X', 'Ayashi no Ceres', 'Card Captor Sakura', 'Tsubasa', 'Chobits', 'Sakura Taisen', 'Inuyasha' wo 'Ah! Megamisama'. Hai, mangaka gozaimashita desu ni yuujin yori.
Eingefügtes Bild
Ja, mata ne!

(For sending email please use OpenPGP encryption and signing. KeyID: 0xA0E28D18)
0

#5 Mitglied ist offline   Torian 

  • Gruppe: aktive Mitglieder
  • Beiträge: 68
  • Beigetreten: 01. September 04
  • Reputation: 0
  • Geschlecht:Männlich

geschrieben 10. September 2005 - 15:06

So jetzt habe ich den Stringstream gleich mit wort initialisiert aber das hat auch nichts geändert. was mir gearde noch aufgefallen ist, wenn ich in wort nur numerische Wrte drinhabe geht auch das.

unsigned long wort2zahl(string wort)
{
    stringstream zahl(wort);
    unsigned long nummer=0;
    cout << "Function: " << wort << endl;
    cout << "Function: " << zahl << endl;
    zahl >>nummer;
    cout << "Function: " << nummer << endl;
    return nummer;          
}


Das komische ist ja das ich später die Zahlen die diese Funktion liefern sollte noch in Hex umrechne und auch da wieder mit Stringstreams arbeite aber hier funzt es. Hast du ne Ahnung warum?

void zahl2hex(unsigned long nummer, stringstream &hex)
{
     int tmp=0;
     unsigned long tmp2=nummer;
     do
     {
              tmp=tmp2%16;
              switch(tmp)
              {
                   case 0: hex << 0; break;
                   case 1: hex << 1; break;
                   case 2: hex << 2; break;
                   case 3: hex << 3; break;
                   case 4: hex << 4; break;
                   case 5: hex << 5; break;
                   case 6: hex << 6; break;
                   case 7: hex << 7; break;
                   case 8: hex << 8; break;
                   case 9: hex << 9; break;
                   case 10: hex << "A"; break;
                   case 11: hex << "B"; break;
                   case 12: hex << "C"; break;
                   case 13: hex << "D"; break;
                   case 14: hex << "E"; break;
                   case 15: hex << "F"; break;     
              }
              tmp2=tmp2/16;
              
     }while(tmp2!=0);
     
}



Hast du vielleicht noch ein paar infos bezüglich anderer Konvertierungen?

Gruß
Torian
0

#6 Mitglied ist offline   [U]nixchecker 

  • Gruppe: aktive Mitglieder
  • Beiträge: 347
  • Beigetreten: 17. Mai 05
  • Reputation: 0
  • Wohnort:Bayern
  • Interessen:Informatik, Linux, Rollerbladen, Bodybuilding, GungFu

geschrieben 11. September 2005 - 13:02

Mal ne Frage, was steht bei dir denn in wort drin?

Du kannst doch nicht in wort z.B. nen String drin stehen haben wie z.B. "Hallo" und dann zahl >> nummer reinschreiben? Was willst du damit erreichen, ich dachte, du willst sowas wie:

H=72
a=97
.....

oder willst dann 72+97+...?

Aufjedenfall musst du um den Integer Wert eines Characters zu bekommen jeden Char einzeln behandeln, also jeden Character aus zahl rausholen mit get umwandeln ...
0

#7 Mitglied ist offline   Torian 

  • Gruppe: aktive Mitglieder
  • Beiträge: 68
  • Beigetreten: 01. September 04
  • Reputation: 0
  • Geschlecht:Männlich

geschrieben 11. September 2005 - 17:43

In wort steht ein char eines kompletten strings, allerdings noch in einer variablen vom Typ String wenn ich versuch diesen Buchstaben in einer Char zu speichern gibts ne "Invalid type conversion const char to char". Mit diesem Problem hatte ich mich aber noch nicht weiter beschäftigt, wenn du allerdings eine Idee hast immer her damit. ;D

Gruß
Torian
0

#8 Mitglied ist offline   [U]nixchecker 

  • Gruppe: aktive Mitglieder
  • Beiträge: 347
  • Beigetreten: 17. Mai 05
  • Reputation: 0
  • Wohnort:Bayern
  • Interessen:Informatik, Linux, Rollerbladen, Bodybuilding, GungFu

geschrieben 11. September 2005 - 19:25

wenn in wort nur ein Buchstabe drin ist, ganz einfach:


stringstream zahl(wort);
char c;
unsigned long nummer=0;
c= zahl.get();
nummer=c;
cout << nummer;
return nummer;
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0