Es gibt eine Reihe von Win32-Funktionen, die die Adresse eines Puffers wie TCHAR[256]
übernehmen und einige Daten in diesen Puffer schreiben. Es kann weniger als die Größe des Puffers oder der gesamte Puffer sein.
Oft wird das in einer Schleife aufgerufen, um beispielsweise Daten aus einem Stream oder einer Pipe zu lesen. Am Ende möchte ich effizient eine Zeichenfolge zurückgeben, die die vollständigen Daten von allen wiederholten Aufrufen enthält, um diese Daten abzurufen. Ich hatte gedacht, std::string
zu verwenden, da es + = in ähnlicher Weise wie Java oder C #%% s StringBuffer.append()
/ StringBuilder.Append()
Methoden optimiert ist, was Geschwindigkeit statt Speicher bevorzugt.
Aber ich bin mir nicht sicher, wie man die std::string
mit Win32-Funktionen am besten kombinieren kann, da diese Funktionen die char[]
verwenden, um damit zu beginnen. Irgendwelche Vorschläge?
std::string
hat eine Funktion c_str()
, die die entsprechende Zeichenfolge im C-Stil zurückgibt. ( const char *
)
Außerdem hat std::string
den Zuweisungsoperator überladen, der eine Zeichenfolge im C-Stil als Eingabe verwendet.
z.B. Wenn ss
be std::string
instance und sc
eine Zeichenfolge im C-Stil sind, dann kann die Umwandlung wie folgt durchgeführt werden:
UPDATE:
Wie Mike Weller sagte: Wenn UNICODE
macro definiert ist, dann sind die Strings wchar_t*
und Sie müssten stattdessen std::wstring
verwenden.
Wenn das Argument nur Eingabe ist, verwenden Sie std::string
wie folgt
Wenn das Argument Eingabe / Ausgabe ist, verwenden Sie stattdessen std::vector<char>
wie folgt:
Wenn das Argument Nur-Ausgabe ist, verwenden Sie auch std::vector<Type>
wie folgt:
Sie können bei Bedarf auch std::basic_string<TCHAR>
und std::vector<TCHAR>
verwenden.
Sie können mehr zu dem Thema in dem Buch Effective STL von Scott Meyers lesen.
Anstelle von std :: string würde ich vorschlagen, std::vector
zu verwenden und &v.front()
zu verwenden, während v.size()
verwendet wird. Stellen Sie sicher, dass Speicherplatz bereits vergeben ist!
Sie müssen vorsichtig sein mit std::string
und Binärdaten.
Sie benötigen einen kompatiblen String-Typ: typedef std::basic_string<TCHAR> tstring;
ist eine gute Wahl.
Für reine Eingabeargumente können Sie die Methode .c_str () verwenden.
Für Puffer ist die Auswahl etwas weniger klar:
std :: basic_string zusammenhängende Speicher wie std :: vector is verwendet. Alle std :: basic_string-Implementierungen, die ich gesehen habe, verwenden jedoch zusammenhängenden Speicher, und das C ++ - Standardkomitee betrachtet die fehlende Garantie als einen Fehler im Standard. Der Fehler wurde im C ++ 0x Entwurf korrigiert.
Wenn Sie bereit sind, die Regeln so leicht zu beugen - ohne negative Konsequenzen - können Sie & amp; (* aString.begin ()) als Zeiger auf einen TCHAR-Puffer der Länge aString.size () verwenden. Sonst steckst du mit std :: vector fest.
Was der C ++ - Standardausschuss über den fortlaufenden String-Speicher zu sagen hat:
Dies nicht standardisieren Praxis gibt keine Implementoren mehr Freiheit. Wir dachten, es könnte a Vor einem Jahrzehnt. Aber die Verkäufer haben beide mit ihren gesprochen Implementierungen und mit ihrer Stimme bei den LWG-Treffen. Das Implementierungen werden sein zusammenhängend, egal welcher Standard sagt. So könnte der Standard auch sein geben Sie String-Kunden mehr Design Entscheidungen.