为什么std::istream::getline不适用于std::string?

3
在C++中,istream有一个名为getline的方法,它用于操作C风格字符数组。我知道还有其他独立的getline函数,它们用于操作istreamstd::string。但为什么需要单独的方法?为什么不将其放入istream中呢?还有,为什么istreamgetline只能处理C风格字符串而不能处理std::string呢?
2个回答

2
我认为strings库和streams库是分别开发的。这就是为什么streams库中没有通用std :: string支持的原因。尽管现在使用std :: fstream :: open可以处理一些问题。
需要注意的一点是,在某些情况下,std :: istream :: getline比std :: getline更安全,因此应该优先使用它。
问题在于std :: getline没有检查将要读取的字符串长度。这意味着恶意代码(或损坏的数据源)可以通过提供包含非常长行的数据来破坏内存。
使用std :: istream :: getline可以限制读取的内容。

1
我的想法是它是为了性能而设计的。您可以只分配一次缓冲区块,并可以逐行迭代处理。请注意,以 std::string 为参数的 std::getline 在写入到 s 之前调用 s.erase(),如果该行太长可能会导致 s 分配更多的缓冲区。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接