Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

physX

Treue Seele

  • »physX« ist der Autor dieses Themas

Beiträge: 119

Wohnort: Dresden

  • Private Nachricht senden

1

29.06.2009, 12:21

string std::cout ausgabe

Hallo, ich habe einen string der sich etwas merkwürdig verhält bzw. ich verstehe nicht ganz weshalb sich die Ausgabe hier unterschiedlich verhält:

wenn ich folgenden code verwende (der code laeuft durch eine Schleife):
mit

C-/C++-Quelltext

1
2
std::string tempName;
int tempScore;


C-/C++-Quelltext

1
2
std::cout << "name: " << tempName << std::endl;
std::cout << "score: " << tempScore << "\t indexCount: " << indexCount << std::endl;

bekomme ich diese ausgabe:

Zitat


load the list
nElements: 10
LesePuffer:
Gr÷▀e LesePuffer: 112
name: woodstock
score: 4500 indexCount: 8
name: hobbes
score: 2600 indexCount: 23
name: tweety
score: 2300 indexCount: 35
name: snoopy
score: 1200 indexCount: 47
name: name
score: 1000 indexCount: 59
name: name
score: 900 indexCount: 68
name: name
score: 800 indexCount: 77
name: name
score: 700 indexCount: 86
name: calvin
score: 600 indexCount: 95
name: name
score: 600 indexCount: 107
Enter GameLoop


ändere ich den code aber in

C-/C++-Quelltext

1
2
std::cout << "name: " << tempName;
std::cout << " score: " << tempScore << "\t indexCount: " << indexCount << std::endl;

oder

C-/C++-Quelltext

1
std::cout << "name: " << tempName << " score: " << tempScore << "\t indexCount: " << indexCount << std::endl;


bekomme ich die folgende ausgabe:

Zitat


nElements: 10
LesePuffer:

Gr÷▀e LesePuffer: 112
score: 4500 indexCount: 8
score: 2600 indexCount: 23
score: 2300 indexCount: 35
score: 1200 indexCount: 47
name: namescore: 1000 indexCount: 59
name: namescore: 900 indexCount: 68
name: namescore: 800 indexCount: 77
name: namescore: 700 indexCount: 86
score: 600 indexCount: 95
name: namescore: 600 indexCount: 107
Enter GameLoop


es wird also in den ersten paar Zeilen nicht mehr "name: <tempName>" angezeigt. Ausserdem wird das Leerzeichen bei " score" ignoriert. woran könnte das liegen?

Für mein Programm ist das kein Problem, da die strings ja korrekt da sind und auch korrekt weiterverwendet werden können. Ich würde nur gern verstehen was hier vorgeht.
danke
Gruss

riCo

Treue Seele

Beiträge: 165

Beruf: Student

  • Private Nachricht senden

2

29.06.2009, 12:26

Kann man std::string so einfach mit cout ausgeben? Muss man da nicht .c_str() verwenden?

Auch wenn es nicht die unbedingte Lösung deines problems ist, aber nutze doch einfach die printf-Funktion? :) Zu cout kann ich leider nicht mehr sagen, da ich das nie verwende..

Der ganze Funktions-Code wäre in dem Fall vielleicht sinnvoller, als deine Code-Fragmente.
Wir leben alle unter dem Sternenhimmel, aber wir haben nicht alle den gleichen Horizont.

physX

Treue Seele

  • »physX« ist der Autor dieses Themas

Beiträge: 119

Wohnort: Dresden

  • Private Nachricht senden

3

29.06.2009, 12:26

vielleicht noch als Hintergrundinfo:
bei dem eigentlichen code im Programm handelt es sich um diese memberfunktionen bei der die Daten aus einer Binärdatei eingelesen werden, in der Schleife sollten zur Kontrolle nochmal die eingelesenen Daten in der Konsole angezeigt werden:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
bool CHighscore::LoadList()
{
    std::cout << "load the list " << std::endl;
    m_ScoreList.clear();
    std::ifstream Input("./Data/Highscore.sav",std::ios::in | std::ios::binary);
    int nElements=0;
    if(Input!=NULL)
    {
        Input.seekg(0,ios::end);
        streamsize len=Input.tellg();
        Input.seekg(0,ios::beg);
        char *buffer= new char[len];
        Input.seekg(0,ios::beg);
        Input.read(buffer,len);
        Input.seekg(0,ios::beg);
        Input.read((char *) &nElements,sizeof(nElements));
        std::cout << "nElements: " << nElements << std::endl;
        std::cout << "LesePuffer: "<< (buffer) << std::endl;
        std::cout << "Größe LesePuffer: " << len << std::endl;
        int indexCount=sizeof(nElements);

        for (int i=0;i<nElements;i++)
        {
            int tempScore=0;
            CScoreEntry tempEntry;
            Input.seekg(indexCount,ios::beg);
            Input.read((char *) &tempScore,sizeof(tempScore));
            indexCount+=sizeof(tempScore);
            std::string tempName = buffer+indexCount;
// std::cout durch printf ersetzt, was aber das gleiche Resultat wie oben beschrieben zeigt

            printf("Name: %s \t Score: %i \t IndexCount: %i\n",tempName.c_str(),tempScore,indexCount);
            indexCount+=tempName.size()+1;
            tempEntry.m_sName=tempName;
            tempEntry.m_iScore=tempScore;
            m_ScoreList.push_back(tempEntry);

        }
        delete []buffer;
        Input.close();
        return true;
    }
    else
    {
        std::cout << "Couldn't load Highscore list! Will create a new empty List!" << std::endl;
        Input.close();
        MakeList(m_iMax);
        SaveList();
        return false;
    }
}

physX

Treue Seele

  • »physX« ist der Autor dieses Themas

Beiträge: 119

Wohnort: Dresden

  • Private Nachricht senden

4

29.06.2009, 12:29

Zitat von »"riCo"«

Kann man std::string so einfach mit cout ausgeben? Muss man da nicht .c_str() verwenden?

Auch wenn es nicht die unbedingte Lösung deines problems ist, aber nutze doch einfach die printf-Funktion? :) Zu cout kann ich leider nicht mehr sagen, da ich das nie verwende..

Der ganze Funktions-Code wäre in dem Fall vielleicht sinnvoller, als deine Code-Fragmente.


Hallo .c_str() hatte ich bereits getestet und bekam dabei das gleiche Ergebnis. Über sprintf hab ich noch nicht ausprobiert werd ich aber gleich mal machen.
danke
Gruss

physX

Treue Seele

  • »physX« ist der Autor dieses Themas

Beiträge: 119

Wohnort: Dresden

  • Private Nachricht senden

5

29.06.2009, 12:37

Hallo, bei Verwendung sprintf habe ich genau das gleiche Problem.
Gruss


Zitat von »"physX"«

Zitat von »"riCo"«

Kann man std::string so einfach mit cout ausgeben? Muss man da nicht .c_str() verwenden?

Auch wenn es nicht die unbedingte Lösung deines problems ist, aber nutze doch einfach die printf-Funktion? :) Zu cout kann ich leider nicht mehr sagen, da ich das nie verwende..

Der ganze Funktions-Code wäre in dem Fall vielleicht sinnvoller, als deine Code-Fragmente.


Hallo .c_str() hatte ich bereits getestet und bekam dabei das gleiche Ergebnis. Über sprintf hab ich noch nicht ausprobiert werd ich aber gleich mal machen.
danke
Gruss

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

29.06.2009, 13:30

Re: string std::cout ausgabe

Zitat von »"physX"«

es wird also in den ersten paar Zeilen nicht mehr "name: <tempName>" angezeigt. Ausserdem wird das Leerzeichen bei " score" ignoriert. woran könnte das liegen?


Zeig mal den ganzen Code der Schleife. Was genau ist tempName, wird es vielleicht von einer lokalen Variable geshadowed?


Zitat von »"riCo"«

Kann man std::string so einfach mit cout ausgeben? Muss man da nicht .c_str() verwenden?


ja man kann std::strings einfach so nach cout ausgeben ;)

physX

Treue Seele

  • »physX« ist der Autor dieses Themas

Beiträge: 119

Wohnort: Dresden

  • Private Nachricht senden

7

29.06.2009, 13:32

Re: string std::cout ausgabe

hallo, der dritte post beinhaltet den code zur Schleife ...
Gruss

Zitat von »"dot"«

Zitat von »"physX"«

es wird also in den ersten paar Zeilen nicht mehr "name: <tempName>" angezeigt. Ausserdem wird das Leerzeichen bei " score" ignoriert. woran könnte das liegen?


Zeig mal den ganzen Code der Schleife. Was genau ist tempName, wird es vielleicht von einer lokalen Variable geshadowed?


Zitat von »"riCo"«

Kann man std::string so einfach mit cout ausgeben? Muss man da nicht .c_str() verwenden?


ja man kann std::strings einfach so nach cout ausgeben ;)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

29.06.2009, 14:22

oh, sry, hab ich übersehen...

Hast du das teil denn mal debuggt? Bist du dir wirklich 100% ig sicher dass in dem String da das richtige drin steht? So ganz mag ich da nämlich irgendwie net glauben...

physX

Treue Seele

  • »physX« ist der Autor dieses Themas

Beiträge: 119

Wohnort: Dresden

  • Private Nachricht senden

9

29.06.2009, 14:39

hallo, ja in dem string steht wirklich das richtige drin... hab aber glaube grad den Fehler gefunden.
der debugger zeigt ein zusätzliches "\r" an, also z.b. "miraculix\r"... damit springt er natuerlich immer an den zeilenanfang, was das Problem bei der Darstellung ist. Weisst du wie man dieses \r wieder entfernen kann?
Danke
Gruss

Zitat von »"dot"«

oh, sry, hab ich übersehen...

Hast du das teil denn mal debuggt? Bist du dir wirklich 100% ig sicher dass in dem String da das richtige drin steht? So ganz mag ich da nämlich irgendwie net glauben...

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

29.06.2009, 14:51

ist da ein newline zeichen in dem string? wie hast du die datei geschrieben, als textdatei!? windows stellt zeilenumbrüche in textdateien als \r\n dar...

Werbeanzeige