Wie std :: string mit Win32-Funktionen mischen, die char [] Puffer nehmen?

7

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?

    
Leeks and Leaks 13.01.2010, 15:43
quelle

4 Antworten

6

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:

%Vor%

UPDATE:

Wie Mike Weller sagte: Wenn UNICODE macro definiert ist, dann sind die Strings wchar_t* und Sie müssten stattdessen std::wstring verwenden.

    
missingfaktor 13.01.2010, 15:48
quelle
11

Wenn das Argument nur Eingabe ist, verwenden Sie std::string wie folgt

%Vor%

Wenn das Argument Eingabe / Ausgabe ist, verwenden Sie stattdessen std::vector<char> wie folgt:

%Vor%

Wenn das Argument Nur-Ausgabe ist, verwenden Sie auch std::vector<Type> wie folgt:

%Vor%

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.

    
Dmitry 13.01.2010 16:04
quelle
6

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.

%Vor%     
Brian R. Bondy 13.01.2010 15:46
quelle
2
  • 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:

Es ist nicht garantiert, dass

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.

    
Joe Gauterin 13.01.2010 16:17
quelle

Tags und Links