TMemoryStream zu String [gelöst]
-
Hallo,
hab hier vermutlich eine absolute Anfängerfrage.... hab schon gesucht und probiert aber komme auf keinen grünen Zweig.
Das Problem:
Ich habe einen TMemoryStream bzw. Daten darin und möchte diese in einen String ablegen. (Der TMemoryStream kommt von einem IdHTTP->Post und enthält den Rückgabewert des Servers...)
Hoffe mir kann da jemand weiterhelfen - vielen Dank schonmal!
Gruß,
Wolfgang
-
TMemoryStream scheint wohl so ein Borland-Kram zu sein... da es ein Stream ist, wird es wohl eine Read-Methode geben, mit der du die Daten da rauskriegst. Direkt mit std::string wird das nichts, aber mit einem vector<char> vielleicht.
-
Ja, ist wohl Borland Kram. Ist das RAD Studio...
bin absoluter Anfänger und kann mit vector<char> grad nicht viel anfangen - werd erstmal nachlesen.
Vorher war das Ding halt so gelöst:
Memo1->Lines->LoadFromStream(InStream);
-
Was kann denn vector<char>, was std::string nicht kann? Ist doch quasi das gleich minus die Stringmanipulationsmethoden.
@Threadersteller: Kann dir leider auch nicht helfen, weil ich ebenfalls nicht weiß, was TMemoryStream genau ist.
-
ich kenne IdHTTP zwar nicht, aber ich bin mir sicher, dass man die daten in einem TStream kriegt.
Dan kann man die Sache einfach machen und anstatt TMemoryStream, TStringStream nutzen.
Durch die Funktion ReadString kriegst du dan einen String zurück.sonst halt über einen Buffer;
zBconst int Max_Length = 20; char Buffer[Max_Length]; Stream->Read(&Buffer,Max_Length); AnsiString String1 = Buffer; std::string String2 = Buffer;auch hier nachzulesen
http://docwiki.embarcadero.com/VCL/de/Classes.TStream
-
SeppJ schrieb:
Was kann denn vector<char>, was std::string nicht kann? Ist doch quasi das gleich minus die Stringmanipulationsmethoden.
@Threadersteller: Kann dir leider auch nicht helfen, weil ich ebenfalls nicht weiß, was TMemoryStream genau ist.
Man kann ihn direkt als Buffer für irgendwelche Read-Operationen benutzen:
KomischerStreamTypOhneIteratoren.read(&vec[0], vec.size(). Mit einemstd::stringsollte man das nicht machen.
-
SeppJ schrieb:
Was kann denn vector<char>, was std::string nicht kann?
Einen
char*liefern.Edit: Mensch, Tachyon.
-
Danke an alle für die Hilfe - besonders an BigNeal - der Hinweis mit dem Buffer hat geholfen.
IdHTTP->Post arbeitet offensichtlich _nicht_ mit TStream
Für all diejenigen die es interessiert hier die Funktion in ihrer Gesamtheit:
String Tsms_sender::CheckCash(String username, String password) { String params = "id=" + username + "&pw=" + password; TMemoryStream *InStream=new TMemoryStream(); TMemoryStream *OutStream=new TMemoryStream(); OutStream->Write(UnicodeString(params).c_str(), params.Length()); IdHTTP1->Request->ContentType="application/x-www-form-urlencoded"; try { IdHTTP1->Post("http://me.local/rad/konto.php", OutStream, InStream); } catch(...) { sms_text->Lines->Add("Hinweis: Exception von IdHTTP"); } InStream->Position=0; const int Max_Length = 20; char Buffer[Max_Length]; InStream->Read(&Buffer,Max_Length); String inas = Buffer; delete OutStream; delete InStream; return inas; }Achja, auch der Link auf embarcadero war super, hier hab ich nämlich das gefunden:
http://docwiki.embarcadero.com/VCL/de/Classes.TMemoryStream - TMemoryStream ist also eine abgeleitete Klasse aus TStream.
-
Babblfish schrieb:
IdHTTP->Post arbeitet offensichtlich _nicht_ mit TStream
versuch einfach mal
String Tsms_sender::CheckCash(String username, String password) { String params = "id=" + username + "&pw=" + password; TStringStream *InStream=new TStringStream(); TStringStream *OutStream=new TStringStream(); OutStream->WriteString(UnicodeString(params)); IdHTTP1->Request->ContentType="application/x-www-form-urlencoded"; try { IdHTTP1->Post("http://me.local/rad/konto.php", OutStream, InStream); } catch(...) { sms_text->Lines->Add("Hinweis: Exception von IdHTTP"); } InStream->Position=0; const int Max_Length = 20; String inas = InStream->ReadString(Max_Length); String inas = Buffer; delete OutStream; delete InStream; return inas; }und Max_Length kann man natürlich auch dynamisch machen, indem man die grösse vom Stream ausliesst.
-
Danke für den Hinweis... funktioniert. Hatte es vorher direkt mit TStream versucht - und das ging schief (erzeugte eine Zugriffsverletzung).
Nun sieht es so aus:
String Tsms_sender::CheckCash(String username, String password) { String params = "id=" + username + "&pw=" + password; TStringStream *InStream=new TStringStream(); TStringStream *OutStream=new TStringStream(); OutStream->WriteString(UnicodeString(params)); IdHTTP1->Request->ContentType="application/x-www-form-urlencoded"; try { IdHTTP1->Post("http://me.local/rad/konto.php", OutStream, InStream); } catch(...) { sms_text->Lines->Add("Hinweis: Exception von IdHTTP"); } InStream->Position=0; String inas = InStream->ReadString(InStream->Size); delete OutStream; delete InStream; return inas; }Hatte auch schon vorher versucht mit InStream->Size zu arbeiten aber leider funktionierte das nicht da er für char Buffer einen konstanten Ausdruck erwartete (hat sich ja jetzt durch den Verzicht auf Buffer erledigt!)