Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Problem mit char-Umwandlung per stringstream

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
17.12.2015, 02:10 Uhr
Yadgar



Hi(gh)!

In einer Schleife soll ein Dateiname zusammengesetzt werden:


C++:
  [...]
  stringstream conv;
  unsigned short monat;
  string QuelleName, jahr, einzelzahl;
  char zahl;

  for (monat = 1; monat <= 12; monat++)
  {
    QuelleName = jahr;
    QuelleName.append("-");
    
    if (monat < 10)
    {
      QuelleName.append("0");
      zahl = 48+(char)monat;
      conv << zahl;
      conv >> einzelzahl;
      QuelleName.append(einzelzahl);
    }
    else
    {
      QuelleName.append("1");
      zahl = 48+(char)(monat-10);
      conv << zahl;
      conv >> einzelzahl;
      QuelleName.append(einzelzahl);
    }
    QuelleName.append("_Temperatur.txt");
    cout << monat << "\t" << zahl << "\t" << einzelzahl << endl;
  }



Leider behält einzelzahl nach der ersten Umwandlung immer den Wert "1" - was muss ich tun, um den Stream zwischendurch zu leeren?

Mit conv.str(""); nach der Umwandlung funktioniert es NICHT!

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog

Dieser Post wurde am 17.12.2015 um 02:15 Uhr von Yadgar editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
17.12.2015, 18:38 Uhr
ao

(Operator)


Grusel! Den ganzen Schleifenkörper ersetzen durch sowas hier:

{
stringstream conv;
conv << jahr << "-" << monat << "_Temperatur.txt";
conv >> QuelleName;
}

Dieser Post wurde am 17.12.2015 um 20:51 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
17.12.2015, 20:57 Uhr
ao

(Operator)


Hier ist das vollständige Programm, sogar mit Stream-Manipulator, damit der Monat immer zweistellig ausgegeben wird:


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

int main ()
{
    int jahr = 2015;
    
    std::string quelle;
    
    for (int monat = 1; monat <= 12; monat++)
    {
        std::stringstream conv;
        conv << jahr << "-" << std::setw (2) << std::setfill ('0') << monat << std::setw (0) << "_Temperatur.txt";
        conv >> quelle;
        
        std::cout << quelle << std::endl;
    }
    return 0;
}


Dieser Post wurde am 17.12.2015 um 20:57 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
18.12.2015, 02:07 Uhr
Yadgar



Hi(gh)!


Zitat von ao:
Hier ist das vollständige Programm, sogar mit Stream-Manipulator, damit der Monat immer zweistellig ausgegeben wird:


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

int main ()
{
    int jahr = 2015;
    
    std::string quelle;
    
    for (int monat = 1; monat <= 12; monat++)
    {
        std::stringstream conv;
        conv << jahr << "-" << std::setw (2) << std::setfill ('0') << monat << std::setw (0) << "_Temperatur.txt";
        conv >> quelle;
        
        std::cout << quelle << std::endl;
    }
    return 0;
}




Das funktioniert leider auch nicht - monat behält immer den Wert 1! Verstehe das, wer will...

...meine verbesserte Version dagegen:


C++:
  for (monat = 1; monat <= 12; monat++)
  {
    QuelleName = jahr;
    QuelleName.append("-");
    
    if (monat < 10)
    {
      QuelleName.append("0");
      zahl = 48+(char)monat;
      einzelzahl[0] = zahl;
      einzelzahl[1] = '\0';
      QuelleName.append(einzelzahl);
    }
    else
    {
      QuelleName.append("1");
      zahl = 48+(char)(monat-10);
      einzelzahl[0] = zahl;
      einzelzahl[1] = '\0';
      QuelleName.append(einzelzahl);
    }
    QuelleName.append("_Temperatur.txt");
    cout << QuelleName << endl;
  }  



sieht zwar immer noch gruselig aus, aber sie tut das, was sie soll!

Ausgabe:

2014-01_Temperatur.txt
2014-02_Temperatur.txt
2014-03_Temperatur.txt
2014-04_Temperatur.txt
2014-05_Temperatur.txt
2014-06_Temperatur.txt
2014-07_Temperatur.txt
2014-08_Temperatur.txt
2014-09_Temperatur.txt
2014-10_Temperatur.txt
2014-11_Temperatur.txt
2014-12_Temperatur.txt

Bis bald im Khyberspace!

Yadgar
--
Flagmaker - ein Programmier-Blog
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
18.12.2015, 08:37 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



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

int main ()
{
    int jahr = 2015;
    
    for (int monat = 1; monat <= 12; monat++)
    {
        std::stringstream conv;
        conv << jahr << "-" << std::setw (2) << std::setfill ('0') << monat << std::setw (0) << "_Temperatur.txt";
        
        std::cout << conv.str() << std::endl;
    }
    return 0;
}




funktioniert bei mir korrekt
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
18.12.2015, 10:34 Uhr
ao

(Operator)


@Yadgar: Du lässt monat als Schleifenzähler laufen (Datentyp int), die Schleife wird 12mal durchlaufen, aber der Wert verändert sich nicht?? Das kann nicht sein, dann hast du irgendwo einen anderen Fehler.

Vielleicht hast du monat zweimal definiert, einmal in einem inneren, einmal in einem äußeren Scope. Dann verdeckt der innere den äußeren.


einzelzahl[0] = zahl;
einzelzahl[1] = '\0';

Wenn einzelzahl so deklariert ist wie bisher (string einzelzahl;), dann sind das hier Out-of-bounds-Zugriffe, die undefined behaviour erzeugen. Quelle: www.cplusplus.com/reference/string/string/operator%5B%5D/ , Abschnitt "Exception safety". Mit anderen Worten: Ob das funktioniert oder nicht, ist blanker Zufall.

Dieser Post wurde am 18.12.2015 um 10:37 Uhr von ao editiert.
 
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: