getline (tpdaten , AnsiStr_info.c_str());
-
Hi,
schau dir doch mal TFileStream und TStringStream an.
testpunktdaten[datensatz][count]= temp.c_str();
übel.
c_str von AnisString gibt ein Temporären Pointer zurück. Diesen zu speichern macht wenig sinn.So wäre besser:
strcpy(testpunktdaten[datensatz][count],temp.c_str());
davon mal abgesehen verwendet man getline so:
fstream inout("fstream.out"); inout << "Das ist die rede von einem man" << endl; inout << "C'est l'histoire d'un home" << endl; inout << "This is the story of a man" << endl; char p[100]; inout.seekg(0); inout.getline(p,100); //....
-
schon klar das es keinen Sinn macht einen Pointer zu kopieren.
Muss da wohl etwas mehr reinschreiben:string temp;
AnsiString Test...Dan dürfe mein Workaround wieder stimmen, oder? Funktioniert auf jeden Fall.
Ich werd mich wohl nicht weiter damit befassen, warum es nicht geht, wenn ich eine andere Lösung des Problems habe.
-
Original erstellt von packmers:
**schon klar das es keinen Sinn macht einen Pointer zu kopieren.
**hm, du hast nicht verstanden, was ich meine. Sicherlich macht es hier und da Sinn Pointer zu kopieren. Nur eben in diesen Fall nicht, da der Pointer, den du kopieren willst temporär ist.
Original erstellt von packmers:
**
Ich werd mich wohl nicht weiter damit befassen, warum es nicht geht, wenn ich eine andere Lösung des Problems habe.**Schade, du hängst gerade an ein wichtigen Schritt in C++ fest. Nähmlich den umgang mit Pointern zu verstehen. Wenn man sich nihct damit befasst, kann man zukünftige Probleme, die mit Sicherheit kommen werden auch nicht verstehen. Wer Pointer nicht beherscht sollte die Finger von C++ lassen...
[ Dieser Beitrag wurde am 28.02.2003 um 11:35 Uhr von AndreasW editiert. ]
-
Wo er Recht hat, hat er Recht!
(Das mit Pointer verstehen)
-
ich will das aber jetzt auch nicht auf mir sitzen lassen (ist wohl der sinn der kommentare
)
das mit dem pointer versteh ich schon, nur ich versteh dann wiederum nicht warum es funktioniert.
ich geh mal davon aus, dass string temp nicht mit jeden Aufruf (in der schleife) eine neue speicheradresse zugewiesen bekommt. So, wenn ich nun eine schleife laufen lasse in der ich mit getline lfd neue werte reinlese und diese dann mit
ansi[count]=temp.c_str();
zuweise sollte doch in allen zellen von ansi der zuletzt zugewiesen wert (daten die hinter der addresse (pointer) von temp) stehen, oder?
nun das ist nicht so, wenn ihr mir das erklären könnt dann bin ich einsichtig. :p
-
Original erstellt von packmers:
**ich will das aber jetzt auch nicht auf mir sitzen lassen (ist wohl der sinn der kommentare)
**jep
vielleicht hilft dir die FAQ auf die Sprünge.
wür könnten die Problematik ja klären, wenn du mir erzählst was für ein Array ansi[] ist. AnsiStrings ? Wenn ja, warum nimmst du dann den *.c_str() ?
-
Wann Temporaere Pointer ungueltig werden, weis nicht mal Bill Gates
Du musst bei solchen Dingern JEDERZEIT damit Rechnen!!!
Deshalb besser Inhalt kopieren!Das kannste nicht steuern! Wenn Du Pech hast, bleibt der stundenlang gueltig.
(d.h. keine Fehler)
- beim naechsten Programmstart kanns aber anders sein - ist halt unberechenbar!Oder: im Debugmodus gehts, aber nicht die fertige EXE (oder anders'rum)
Auch wenn's funktioniert, besser Vorsicht mit temporaeren Dingern.
-
Hallo AndreasW
getline läuft nun mal nur mit string bzw. char, oder?
und die borlands haben sich für AnsiString entschiedenwo ich jetzt total verwirrt werde, ist das
AnsiString a = "ansi";
string s;s = a.c_str();
keinen wert übergeben soll, ich hab da schon was anderes gelesen, oder bringt Ihr (Du und DerAltenburger) da was durcheinander.
Meine Ursprüngliche Frage lautete ja warum
fstream mystream;
AnsiString a;
string s;mystream.open(...)
getline(mystream,a.c_str());
nicht funktioniert.
getline(mystream,s); // funktioniert problemlos (so soll es ja sein)
a.c_str() ist doch genauso ein pointer wie s nur das er auf den ansistring a zeigt, oder?
-
Hi,
AnsiString a = "ansi"; string s; s = a.c_str();
Ok, das geht, da string den Wert kopiert.
AnsiString a = "ansi"; char* s; s = a.c_str();
das meinte ich, da die Methode c_str() eine nullterminiertes Char- Array zurückgibt, wird bei der Überladene Methode die Methode genomme, die mit char* als Übergabeparameter erwartet.
deshalb hat :
getline(mystream,a.c_str());
nichts mit den strings aus der STL zu tun.
*a.c_str() ist doch genauso ein pointer wie s nur das er auf den ansistring a zeigt, oder?
*hm, hast du den Beitrag von Jansen wirklich gelesen ?
Nochmal ein Link:
AnsiString - nach char* konvertieren
-
Mein Beitrag war nur allgemein auf die Problematik zu Pointern / Temporaeren Dingen gemuenzt!!! Sollte nur klarmachen, dass auf temp Dinger kein Verlass ist!
Deine Zeile mit .... a.c_str()... sollte eigentlich funzen?
Lass das Prog mal bis vor! die Anweisung laufen und teste in Debugger Inhalt der AnsiString- Variable. Steht das richtige drin?