Pero ten en cuenta que un C++ - string (o más concreto: un STL-string) es tan poco como un C-String capaz de contener una cadena de longitud arbitraria - ¡por supuesto que no!
Eche un vistazo al miembro max_size() que le proporciona la cantidad máxima de caracteres que una cadena puede contener. Este es un número de implementación definido y puede no ser portátil entre diferentes plataformas. Visual Studio da un valor de aproximadamente 4gigs para cadenas, otros pueden darte solo 64k y en plataformas de 64 bits, ¡podría darte algo realmente grande! Depende y, por supuesto, normalmente se encontrará con una excepción bad_alloc por agotamiento de memoria mucho antes de alcanzar el límite de 4gig ...
BTW: max_size() también es miembro de otros contenedores STL. Le dará el número máximo de elementos de un tipo determinado (para los que ha instanciado el contenedor) que este contenedor (en teoría) podrá contener.
lo tanto, si usted está leyendo desde un archivo de origen desconocido se debe:
- Compruebe su tamaño y asegurarse de que es más pequeño que max_size()
- captura y proceso bad_alloc-excepciones
y otro point: ¿Por qué le gusta leer el archivo en una cadena? Esperaría procesarlo aún más analizándolo incrementalmente o algo, ¿verdad? Entonces, en lugar de leerlo en una cadena, también podría leerlo en una cadena (que básicamente es solo un poco de azúcar sintáctico para una cadena) y hacer el procesamiento. Pero luego podrías hacer el procesamiento directamente desde el archivo también. Porque si se programa correctamente, la secuencia de cadenas podría ser reemplazada sin problemas por una cadena de archivos, i. mi. por el archivo en sí. ¡O también por cualquier otro flujo de entrada, todos comparten los mismos miembros y operadores y por lo tanto pueden intercambiarse sin problemas!
Y para el procesamiento en sí: ¡también hay mucho que puede haber automatizado el compilador! P.ej. digamos que quieres tokenizar la cadena. Al definir una plantilla adecuada las siguientes acciones:
- Lectura de un archivo (o una cadena o cualquier otro flujo de entrada)
- tokenizing el contenido
- empujar todas las fichas que se encuentran en un STL-contenedor
- ordenar las fichas alfabéticamente
- eleminando cualquier valor doble
pueden lograrse todos (!!) en una sola línea (!) de código C++ (¡dejen de lado la plantilla en sí y el manejo de errores)! ¡Es solo una llamada de la función std :: copy()! Simplemente google para "token iterator" y obtendrás una idea de lo que quiero decir. Así que esto me parece ser aún más "elegante" que solo leer un archivo ...
Si odias las cosas feas, es mejor que no uses C++: P – OregonGhost
Una nota sobre la elegancia, aunque la iostream más elegante la solución aún te parecerá desagradable, puedes encapsular en una función hermosa para que no te lastime los ojos;) – OregonGhost
En cuanto al argumento 'feo': 'while (feo()) encapsulate_more();' –