Aber passen Sie auf, Eine C++ - Zeichenkette (oder konkreter: Eine STL-Zeichenkette) ist so wenig wie eine C-Zeichenkette, die in der Lage ist, eine Zeichenkette beliebiger Länge zu halten - natürlich nicht!
Werfen Sie einen Blick auf das Element max_size(), das Ihnen die maximale Anzahl von Zeichen gibt, die ein String enthalten kann. Dies ist eine in der Implementierung definierte Nummer und ist möglicherweise nicht auf verschiedenen Plattformen übertragbar. Visual Studio bietet einen Wert von ca. 4gigs für Strings, andere geben nur 64k an und auf 64Bit-Plattformen gibt es etwas wirklich großes! Es kommt darauf an und natürlich kommt es normalerweise zu einer bad_alloc-Ausnahme wegen Speichererschöpfung lange bevor das 4gig Limit erreicht wird ...
BTW: max_size() ist auch ein Mitglied von anderen STL-Containern! Es gibt Ihnen die maximale Anzahl von Elementen eines bestimmten Typs (für den Sie den Container eingerichtet haben), die dieser Container (theoretisch) halten kann.
Also, wenn Sie aus einer Datei von unbekannter Herkunft Lesen Sie sollen:
- seine Größe überprüfen und sicherstellen, dass es kleiner als max_size()
- Fang und Prozess bad_alloc-Ausnahmen
Und eine andere Punkt: Warum möchten Sie die Datei in eine Zeichenfolge lesen? Ich würde erwarten, es weiter zu verarbeiten, indem ich es inkrementell analysiere oder so, oder? Anstatt es in eine Zeichenkette zu lesen, können Sie es auch in einen Stringstream lesen (der im Grunde genommen nur ein syntaktischer Zucker für eine Zeichenkette ist) und die Verarbeitung durchführen. Aber dann könnte man die Verarbeitung auch direkt aus der Datei machen. Denn bei richtiger Programmierung könnte der Stringstream nahtlos durch einen Filestream ersetzt werden, d. e. durch die Datei selbst. Oder sie haben alle die gleichen Mitglieder und Operatoren und können somit nahtlos miteinander vertauscht werden!
Und für die Verarbeitung selbst: Es gibt auch eine Menge, die Sie vom Compiler automatisiert haben können! Z.B. Nehmen wir an, Sie möchten die Zeichenfolge in Token setzen. Wenn eine geeignete Vorlage definieren, die folgenden Aktionen:
- Lesen aus einer Datei (oder einer Schnur oder einem anderen Eingabestrom)
- Tokenizing den Inhalt
- alle gefundenen Token in einen STL-Container schieben
- sortieren Sie die Token alphabetisch
- Eliminierung beliebiger Doppelwerte
können alle (!!) in einer einzigen (!) Zeile von C++ - Code realisiert werden (die Vorlage selbst und die Fehlerbehandlung beiseite lassen)! Es ist nur ein Aufruf der Funktion std :: copy()! Googeln Sie einfach nach "Token Iterator" und Sie bekommen eine Vorstellung davon, was ich meine. So scheint mir das noch "eleganter" zu sein als nur aus einer Datei zu lesen ...
Wenn Sie hässliche Sachen hassen, verwenden Sie besser nicht C++: P – OregonGhost
Ein Hinweis auf die Eleganz, obwohl die eleganteste Iostream Lösung wird Ihnen immer noch hässlich erscheinen, Sie können einfach in eine schöne Funktion kapseln, damit es Ihren Augen nicht weht;) – OregonGhost
In Bezug auf das 'hässliche Zeug'-Argument: 'while (hugly()) enkapsulate_more();' –