Но имейте в виду, что строка c ++ (или более конкретная: строка STL) так же мала, как и строка C, способная содержать строку произвольной длины - конечно, нет!
Взгляните на член max_size (), который дает вам максимальное количество символов, которое может содержать строка. Это номер, определяемый реализацией, и он не может быть переносимым между различными платформами. Visual Studio дает около 4 гигабайт для строк, другие могут дать вам только 64 КБ, а на 64-битных платформах это может дать вам что-то действительно огромное! Это зависит и, конечно, обычно вы столкнетесь с ошибкой bad_alloc из-за исчерпания памяти задолго до достижения предела в 4 гигабайта ...
Кстати: max_size () также является членом других STL-контейнеров! Он даст вам максимальное количество элементов определенного типа (для которого вы создали экземпляр контейнера), которое этот контейнер (теоретически) сможет хранить.
Итак, если вы читаете из файла неизвестного происхождения, вам следует:
- Проверьте его размер и убедитесь, что он меньше, чем max_size ()
- Поймать и обработать bad_alloc-исключения
И еще один момент:
Почему вы заинтересованы в чтении файла в строку? Я ожидал бы дальнейшей обработки, постепенно анализируя это или кое-что, правильно? Таким образом, вместо того, чтобы читать это в строку, вы могли бы также прочитать это в поток строки (который в основном является просто синтаксическим сахаром для строки) и выполнить обработку. Но тогда вы можете выполнить обработку непосредственно из файла. Потому что при правильном программировании поток строк может быть легко заменен потоком файлов, т.е. е. самим файлом. Или с помощью любого другого входного потока, они все используют одни и те же члены и операторы и, таким образом, могут быть легко заменены!
И для самой обработки: компилятором также можно автоматизировать многое! Например скажем, вы хотите токенизировать строку. При определении правильного шаблона выполняются следующие действия:
- Чтение из файла (или строки, или любого другого входного потока)
- токенизация контента
- положить все найденные токены в STL-контейнер
- сортировать токены по алфавиту
- уничтожение любых двойных значений
все (!!) может быть достигнуто в одной (!) строке C ++ - кода (не говоря уже о самом шаблоне и обработке ошибок)! Это всего лишь один вызов функции std :: copy ()! Просто поищите в Google «итератор токенов», и вы поймете, что я имею в виду. Так что мне кажется, что это даже более "элегантно", чем просто чтение из файла ...