[gelöst] (C++) Seltsames verhalten von cout

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
obsCure
Beiträge: 124
Registriert: 15.12.2003 14:44:04
Wohnort: Dresden
Kontaktdaten:

[gelöst] (C++) Seltsames verhalten von cout

Beitrag von obsCure » 20.09.2006 22:36:41

Hallo Forum

Ich habe eine Klasse zum lesen von CSV-Files geschrieben. Bei der Weiterverarbeitung der Daten bin ich auf ein seltsames Problem gestossen:

csv.getElement(4) sollte "foo" zurückliefern, csv.getElement(5) "bar"

Code: Alles auswählen

// funktioniert
string a,b;
a = csv.getElement(4);
b = csv.getElement(5);
cout << "foo: " << a << " - " << b << endl;
liefert "foo: foo - bar " zurück, genauso wie

Code: Alles auswählen

//funktioniert auch
cout << "foo: " <<  csv.getElement(4);
cout << " - " << csv.getElement(5) << endl;
Wenn ich aber:

Code: Alles auswählen

//funktioniert nicht
cout << "foo: " << csv.getElement(4)  << " - " << csv.getElement(5) << endl;
schreibe, erhalte ich "foo: - bar" als Ausgabe - d.h. getElement(4) wird überschrieben oder was auch immer.

Ich denke ich mache einen trivialen Fehler, hat jemand von Euch ne Idee?
Zuletzt geändert von obsCure am 21.09.2006 10:37:34, insgesamt 1-mal geändert.

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 20.09.2006 22:52:47

Dazu müsste man wissen, wie csv implementiert ist.

jaywalker
Beiträge: 371
Registriert: 14.09.2006 12:13:19

Beitrag von jaywalker » 20.09.2006 23:03:03

Als Hinweis: Soweit ich weiß ist diie Auswertungsreihenfolge der csv.getElement(x)-Aufrufe in der letzten Zeile nicht definiert und der Compiler wertet evtl. erst getElement(5) und danach getElement(4) aus. Macht das der Klasse was?

Grüße
Heiner

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 20.09.2006 23:21:31

Z.B. gibt folgendes Programm

Code: Alles auswählen

#include <iostream>
using namespace std;
int main()
{
   int a = 0;
   cout << a++ << a++ << a++ << a++ << endl;
}
Bei mir "3210" aus. Es könnte aber auch "0123" oder "1320" oder irgendeine Permutation davon ausgeben.

Benutzeravatar
obsCure
Beiträge: 124
Registriert: 15.12.2003 14:44:04
Wohnort: Dresden
Kontaktdaten:

Beitrag von obsCure » 21.09.2006 10:02:14

Vielen Dank für Eure Antworten.

Das die Auswertereihenfolge nicht festgelegt ist, ist ein interessanter Hinweis - bei mir verschwindet aber ein Wert. Scheinbar wird der erste getElement-Aufruf ignoriert 8O

Die Funktion ist wie folgt definiert:

Code: Alles auswählen

string CsvFile::getElement(int Number)
{
    string data = "";
    while ( elementCounter < Number ) {
        elementCounter++;
        if ( getline(inf, data, seperator).eof() ) {
            return "Zeilenende";
        }       
    }       
    return data;
}
Der Stream wird vorher an anderer Stelle geöffnet.

Benutzeravatar
GoKi
Beiträge: 2068
Registriert: 04.07.2003 23:08:56
Lizenz eigener Beiträge: MIT Lizenz

Beitrag von GoKi » 21.09.2006 10:13:49

Wenn elementCounter nirgends wieder auf 0 gesetzt wird, dann kann es passieren, dass der while-loop nicht mehr betreten wird. Deine Ausgabe ist also leer. Und genau das scheint hier ja auch zu passieren, wenn zuerst getElement(5) und dann getElement(4) aufgerufen wird.
MfG GoKi
:wq

Benutzeravatar
obsCure
Beiträge: 124
Registriert: 15.12.2003 14:44:04
Wohnort: Dresden
Kontaktdaten:

Beitrag von obsCure » 21.09.2006 10:37:10

Das wars. Da die Aufrufe in umgekehrter Reihenfolge passieren können, wird die Schleife nicht mehr betreten.

Danke, Ihr habt mir sehr geholfen.

Antworten