2015-06-15 2 views
3

В C++ istream имеет метод, называемый getline, который работает с массивом символов C-стиля. Я знаю, что существуют другие независимые функции getline, которые работают на istream и std::string. Но почему отдельный метод? Почему бы не поместить его в istream? И почему вывод istream работает только на строках C-стиля вместо std::string?Почему std :: istream :: getline не работает на std :: string?

ответ

1

Моя мысль заключается в том, что она предназначена для повышения производительности. Вы можете выделить блок буфера только один раз, и он может итеративно обрабатывать строки за строкой. Обратите внимание, что std::getline, который принимает в качестве аргумента std::string, вызывает s.erase() перед записью в s, и это может привести к тому, что s выделит больше буфера, если линия слишком длинная.

2

Я думаю, что строки библиотека и потоки библиотека была разработана отдельно. Я думаю, именно поэтому у нас нет универсальной поддержки std::string в потоках . Хотя это было рассмотрено немного, но с теперь принимает строки.

Следует отметить, что std::istream::getline более безопасен, чем std::getline, поэтому в некоторых ситуациях это должно быть предпочтительнее.

Проблема std::getline не проверяет длину строки, которая будет считана. Это означает, что вредоносный код (или поврежденный источник данных) может взорвать память, представляя данные, содержащие очень длинную строку.

С std::istream::getline у вас есть предел на сколько можно прочитать.

Смежные вопросы