В C++ istream
имеет метод, называемый getline
, который работает с массивом символов C-стиля. Я знаю, что существуют другие независимые функции getline
, которые работают на istream
и std::string
. Но почему отдельный метод? Почему бы не поместить его в istream
? И почему вывод istream
работает только на строках C-стиля вместо std::string
?Почему std :: istream :: getline не работает на std :: string?
ответ
Моя мысль заключается в том, что она предназначена для повышения производительности. Вы можете выделить блок буфера только один раз, и он может итеративно обрабатывать строки за строкой. Обратите внимание, что std::getline
, который принимает в качестве аргумента std::string
, вызывает s.erase()
перед записью в s
, и это может привести к тому, что s
выделит больше буфера, если линия слишком длинная.
Я думаю, что строки библиотека и потоки библиотека была разработана отдельно. Я думаю, именно поэтому у нас нет универсальной поддержки std::string
в потоках . Хотя это было рассмотрено немного, но с теперь принимает строки.
Следует отметить, что std::istream::getline
более безопасен, чем std::getline
, поэтому в некоторых ситуациях это должно быть предпочтительнее.
Проблема std::getline
не проверяет длину строки, которая будет считана. Это означает, что вредоносный код (или поврежденный источник данных) может взорвать память, представляя данные, содержащие очень длинную строку.
С std::istream::getline
у вас есть предел на сколько можно прочитать.
- 1. std :: getline() возвращает
- 2. StD :: GetLine на окнах
- 3. std :: getline не принимает std :: back_insert_iterator
- 4. Чтение непосредственно из std :: istream в std :: string
- 5. Почему std :: cin.getline не имеет метод oveloaded для ввода std :: string?
- 6. Инициализация istream атрибут с std :: string
- 7. std :: getline (std :: cin, custom_class); несоответствие типов
- 8. Пропустить строки в std :: istream
- 9. C++ std :: getline error
- 10. std :: getline() не заканчивается/захватывает
- 11. Программа пропускает std :: getline
- 12. Почему компилятор думает, что std :: string & передается не std: string
- 13. Почему не std :: string :: max_size() == std :: string :: allocator :: max_size()
- 14. std :: istream :: получить эффективность
- 15. std :: istream :: read не блокируется?
- 16. Почему не std :: string специализируется на std :: vector?
- 17. Почему '==' медленнее на std :: string?
- 18. Не получая линий - std :: getline
- 19. std :: getline удаляет пробелы?
- 20. std :: string :: find() не работает с std :: string как аргумент
- 21. Почему std string == crashing?
- 22. Ошибка отладки - std :: getline
- 23. Как написать оператор `std :: istream`
- 24. Почему std :: string str = {}?
- 25. Почему я могу вызвать getline без использования std :: getline?
- 26. Почему std :: string :: append() менее мощный, чем std :: string :: operator +()?
- 27. Boost :: knuth_morris_pratt over std :: istream
- 28. Недопустимый тип оператора std :: istream?
- 29. Seek не работает на std :: istream инициализирован с boost filtering_istreambuf
- 30. Как безопасно читать строку из std :: istream?